На 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 года.