.bash_history продолжает усекать

Если Вы запускаете 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"; }' ;
}

2
28.11.2014, 00:42
2 ответа

.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
4
27.01.2020, 22:00

Вы должны проверить все файлы, которые загружаются с помощью всех видов оболочек. Для меня это оказался файл /etc/bash.bashrc, который включал эти две строки

HISTSIZE=1000
HISTFILESIZE=2000

. Я не могу сказать, почему это имело значение, поскольку я сбрасывал их в своем .bashrc, но, закомментировав эти строки, У меня все заработало.

Я начал замечать эту проблему после перехода на Ubuntu с Debian. Поскольку в Debian строк не было, и я никогда не видел там никаких проблем, я вполне уверен, что это окончательное решение.

0
27.01.2020, 22:00

Теги

Похожие вопросы