Если Вы хотите выполнить команду и добраться, вывод используют строку ниже
d=`git log`
В Вашем сценарии необходимо измениться два две вещи. У меня есть корректный сценарий ниже
#!/bin/bash rep="*" for f in `ls -R $rep`; do d=`git log $f| wc -l` c=$d echo $c done
Править: Исходное исправление изменяет кавычки на обратные галочки, чтобы заставить вывод достигнуть d переменной. Кроме того, $rep должен быть в обратных галочках с ls, иначе он добавит * в конце последнего обработанного имени файла.
Я уже ответил на Вашу другую Синтаксическую ошибку вопроса в сценарии удара, который находят вызовы, таким образом, я не повторю то, что я уже записал в своем ответе там.
Не анализируйте вывод ls
. Вы не должны работать ls
перечислить файлы в каталоге. Использовать find
если необходимо рекурсивно вызвать в подкаталоги.
Получить вывод wc -l
, используйте его в замене команды: $(git log "$f" | wc -l)
Обратите внимание необходимость в двойных кавычках вокруг имени переменной. Всегда используйте двойные кавычки вокруг переменной и управляйте заменами: "$foo"
, "$(foo)"
. Двойные кавычки выключают последующую обработку оболочки значения переменной или управляют выводом: без кавычек результат разделяется на слова, которые интерпретируются как подстановочные шаблоны файла. С одинарными кавычками, $
знак не рассматривают особенно, таким образом, git
видел бы $f
вместо значения.
find . -type f -exec sh -c '
for x in "$@"; do
c=$(git log "$f" | wc -l)
done
' _ {} +
Использование -exec … {} +
вместо -exec … {} \;
позволяет промежуточной оболочке быть вызванной только однажды на большой пакет файлов, который немного быстрее.
Начиная с удара ≥4, Вы не должны использовать find
, можно использовать **
синтаксис для рекурсивного вызова в подкаталоги.
shopt -s globstar
for x in **/*; do
[ -f "$x" ] || continue # skip directories and other non-regular files
git log "$x" | wc -l
done
Насколько я знаю команду:
git log
Покажет все истории пересмотра. Если это верно, я предполагаю, что Вы пытаетесь сохранить содержание в файле, названном myfile, и затем Вы хотите не считать никакие из строк в файле.
Если это - то, что Вы хотите, сначала можно сохранить историю таким образом:
git log>myFile.txt
Теперь Вы не должны находить никакие из строк с помощью туалета-l и хранить его файл под названием nOfLines.txt
Таким образом, необходимо сделать это:
wc -l<myFile.txt>nOfLines.txt
Затем сохраните содержание этого файла в переменной, названной gitVar.
gitVar=$(cat nOfLines.txt)
Вы видите, работает ли это правильно с помощью этой команды:
echo "$gitVar"
Просто свяжите все это в сценарии, названном "myCommand.sh", дайте ему permssions, использующий chmod a+x, и запустите скрипт от терминала как команда.
wc -l < myFile.txt > nOfLines.txt
вместо этого избегать wc
упоминание входного имени файла в его выводе.
– manatwork
10.10.2012, 13:02
=
в присвоении: gitVar=$(cat nOfLines.txt)
.
– manatwork
10.10.2012, 13:07
Я думаю, что Вы хотите сделать:
#!/bin/bash
rep="*"
for f in `ls -R`$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done
Заметьте двойные кавычки вместо единственных вокруг команды мерзавца.
Меньшее решение могло состоять в том, чтобы использовать:
echo `git log "$f"| wc -l`
eval
команда :). Спасибо – user15992 10.10.2012, 12:42