Я пишу простой скрипт для поиска истории в bash, чтобы найти определенную строку. В командной строке я могу сделать следующее, что прекрасно работает:
history | grep git
Однако, когда я создаю скрипт bash с той же командой, что и выше, неожиданно history
ничего не возвращается:
#!/bin/bash
history | grep git
Когда я удаляю первую строку #!/bin/bash
, мой скрипт снова работает. Что здесь происходит? Как я могу использовать history
внутри сценария Bash?
bash
shell-script
command-history
Мартин Вегтер
источник
источник
bash
пользователь v3, из-за простого разочарования, хаха). По крайней мере, для Мартина мое решение было очень полезно, это (по крайней мере) комфорт.Когда вы запускаете сценарий оболочки bash, например, запустив исполняемый файл, строка которого
#!/bin/bash
обозначена как shebang , сценарий запускается в неинтерактивной оболочке. Одной из особенностей неинтерактивной оболочки является то, что история отключена. Поэтому, если вы хотите, чтобы ваш скрипт мог использовать историю, вам нужно сделать что-то вроде этого:Конечно, в этом случае вы могли бы просто сделать:
Поскольку оба вышеперечисленных требуют, чтобы файл history (
~/.bash_history
) был обновлен, чего почти наверняка не будет.Я не уверен, как вы запускаете свой скрипт после удаления строки shebang. Sourcing файл (например., С
.
) является не то же самое , как работает скрипт , потому что команды выполняются в текущей оболочке, которая действительно имеет историю включен.источник
history -a
сразу после команды set убедиться, что последние команды добавляются в файл первыми?