Если Вы запускаете Linux, Ваш wc
вероятно, прибывает из GNU Coreutils и имеет a --files0-from
опция считать файл (или stdin) содержащий произвольно длинный список NUL-завершенных названий файла для подсчета. В документации туалета Coreutils GNU говорится, что "Это полезно, когда список имен файлов является таким длинным, что это может превысить ограничение длины командной строки. В таких случаях рабочий туалет через xargs является нежелательным, потому что он разделяет список на части и заставляет туалет распечатать общее количество для каждого подсписка, а не для всего списка".
Так попробуйте это:
lc() { git ls-files -z ${1} | wc -l --files0-from=- ; }
Править: Начиная с Вашего wc
с прошлого тысячелетия и не имеет той опции, вот более портативное решение, предполагая, что Вы имеете awk
и не имейте никаких файлов названными "общим количеством". Это отфильтрует вывод wc
, исключение любого total
строки и вместо этого подведение их итогов и распечатывание общий итог в конце.
Одна вещь, которую я не знаю, состоит в том ли git
реализация псевдонима будет иметь проблемы с $1
и $2
в одинарных кавычках, которые должны быть переданы неизменные awk
.
lc() {
git ls-files -z ${1} |
xargs -0 wc -l |
awk 'BEGIN { total=0; } { if (NF==2 && $2 == "total") total += $1; else print; } END { print total, "total"; }' ;
}
.bash_profile
загружается только в том случае, если bash запускается как оболочка для входа в систему . В OSX по умолчанию запускается оболочка для входа в каждый терминал, так что это обычный случай для вас. Но если вы когда-нибудь наберете bash
, чтобы запустить вложенную оболочку, или запустите screen или tmux, или что-нибудь еще, что запустит интерактивную оболочку, вы получите интерактивную оболочку, не входящую в систему. Эта оболочка только читает ~/.bashrc
, она не читает ~/.bash_profile
. Так как вы экспортировали HISTFILESIZE
в окружение, оболочка, запущенная из программы, запущенной с терминала, который запустил оболочку для входа в систему, унаследует эту настройку. Но оболочка, запущенная независимо, не унаследует этого параметра (что является фундаментальным недостатком в подходе OSX к запуску оболочек для входа в систему на терминалах). Поэтому оболочка, запущенная внутри терминального эмулятора, который не запускает оболочку для входа в систему, или в сессии экрана, запущенной заданием cron, или в Aquamacs, и т.д., не будет иметь настройки HISTSIZE
или HISTFILESIZE
и, таким образом, будет использовать значения по умолчанию.
Исправление заключается в установке HISTSIZE
и HISTFILESIZE
в нужном месте: в ~/.bashrc
.
Bash странно читает .bashrc
только из нелогинных интерактивных оболочек. Чтобы прочитать его во всех интерактивных оболочках, поместите следующую строку в ваш .bash_profile
:
case $- in *i*) . ~/.bashrc;; esac
Вы должны проверить все файлы, которые загружаются с помощью всех видов оболочек. Для меня это оказался файл /etc/bash.bashrc, который включал эти две строки
HISTSIZE=1000
HISTFILESIZE=2000
. Я не могу сказать, почему это имело значение, поскольку я сбрасывал их в своем .bashrc, но, закомментировав эти строки, У меня все заработало.
Я начал замечать эту проблему после перехода на Ubuntu с Debian. Поскольку в Debian строк не было, и я никогда не видел там никаких проблем, я вполне уверен, что это окончательное решение.