Почему в bash по умолчанию отсутствуют некоторые команды, которые я использовал в истории, но есть другие?

Почему в bash по умолчанию отсутствуют некоторые команды, которые я использовал в истории, но есть другие?

На Mac — Sierra.

У меня нет HISTсвязанных настроек, которые я мог бы видеть:

~ @ Magni (jcollum) 
$ env|grep HIST

~ @ Magni (jcollum) 
$ cat ~/.bash_profile | grep HIST

~ @ Magni (jcollum) 

Но у меня есть вещи в моей истории, которые я делал вчера, которых нет после перезапуска. Очень-очень сомневаюсь, что я ставил пробелы перед командой каждый раз, когда делал это.

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

Например, когда я выполняю grep для a curl, который я запускал вчера, ничего не получается:

~ @ Magni (jcollum) 
$ history | grep curl 
166  curl -X POST -d [email protected] -d password=********** http://localhost:3000/login
503  hg curl 
519  history | grep curl 

400 команд назад? Я знаю, что использовал curlдюжину раз на прошлой неделе, но (и я не так часто использую bash, чтобы запустить сотни команд на этой неделе).

В общем, я просто озадачен и не знаю, почему так много из того, что я сделал, отсутствует. Возможно ли, что история записывается только с одного экземпляра bash?

решение1

Возможно ли, что история записывается только из одного экземпляра bash?

Вот что происходит. История в bash работает следующим образом, если только вы не приложили немало усилий, чтобы ее изменить:

  • При запуске bash загружает сохраненную историю из файла истории.
  • Каждый раз, когда выполняется команда, она добавляется в историю в памяти bash.
  • При выходе из bash накопленная история сохраняется в файле истории.

Теперь предположим, что вы запускаете два экземпляра bash. Оба загружают файл истории при запуске. Оба добавляют команды, которые они запускают, в свою собственную историю. Когда один экземпляр завершает работу, он сохраняет старую историю плюс свои собственные команды в файл истории. Когда второй экземпляр завершает работу, он сохраняет старую историю плюсегособственную команду в файл истории — и при этом стирает историю с первого завершившегося экземпляра.

Механизм сохранения истории Bash слишком упрощен. Ваши строки истории зависят от всех остальных запущенных экземпляров — последний выход стирает историю других. Решения включают добавление новой истории в файл истории вместо перезаписи файла истории всей историей в памяти или добавление строк в файл истории сразу после их выполнения. СмотритеСохранение истории bash в нескольких терминальных окнахиСохранение истории bash в нескольких терминальных окнахдля некоторых способов реализации этого и других вариантов.

Самое простое решение — запустить zsh, который по умолчанию сохраняет историю разумным образом. Я рекомендую это, особенно если у вас macOS, которая застряла на древней версии bash, потому что Apple не нравится лицензия версий, выпущенных после 2009 года.

Связанный контент