«История» перестает работать при запуске внутри скрипта bash

9

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

history | grep git

Однако, когда я создаю скрипт bash с той же командой, что и выше, неожиданно historyничего не возвращается:

#!/bin/bash
history | grep git

Когда я удаляю первую строку #!/bin/bash, мой скрипт снова работает. Что здесь происходит? Как я могу использовать historyвнутри сценария Bash?

Мартин Вегтер
источник

Ответы:

8

Следующее для bash 4.0 or higher only, но это делает трюк. :)

#!/bin/bash -i
history | grep sometext

Работает! Попробуйте это. ( -i= Я Интерактивно, флаг не доступен для Баш 3.х и ранее)

ошибка синтаксиса
источник
Спасибо также чуваку, который недавно отказался от меня только потому, что он может. (Вероятно, bashпользователь v3, из-за простого разочарования, хаха). По крайней мере, для Мартина мое решение было очень полезно, это (по крайней мере) комфорт.
syntaxerror
У меня был тот же вопрос, когда я писал инструмент, который регистрирует работу в нерабочее время для инженеров поддержки 24/7 ... спасибо!
Генри ван Меген,
14

Когда вы запускаете сценарий оболочки bash, например, запустив исполняемый файл, строка которого #!/bin/bashобозначена как shebang , сценарий запускается в неинтерактивной оболочке. Одной из особенностей неинтерактивной оболочки является то, что история отключена. Поэтому, если вы хотите, чтобы ваш скрипт мог использовать историю, вам нужно сделать что-то вроде этого:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Конечно, в этом случае вы могли бы просто сделать:

grep git ~/.bash_history

Поскольку оба вышеперечисленных требуют, чтобы файл history ( ~/.bash_history) был обновлен, чего почти наверняка не будет.

Я не уверен, как вы запускаете свой скрипт после удаления строки shebang. Sourcing файл (например., С .) является не то же самое , как работает скрипт , потому что команды выполняются в текущей оболочке, которая действительно имеет историю включен.

RICi
источник
Как насчет того, чтобы history -aсразу после команды set убедиться, что последние команды добавляются в файл первыми?
4
@ подсветка: не поможет. Оболочка, запущенная для запуска скрипта, представляет собой совершенно другой процесс; это начинается с пустой пустой истории.
Ричи