5

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

lastCommand=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')

Внутри скриптов, однако, история не работает вообще.

Есть ли способ получить команду внутри скрипта?

2 ответа2

5

Для bash v4+:

Используйте интерактивный режим в оболочке.

Установить She-Bang как

#!/bin/bash -i

и history внутри вашего сценария будет работать.

 $ cat test.sh
#!/bin/bash
history | wc -l
 $ ./test.sh
0
 $ sed -i '1s/bash/bash -i/' test.sh
 $ ./test.sh
6495

Команды, выполненные внутри скрипта, не записываются в историю.

Для bash v3 (и возможно для более старых)

  • Способ выше не работает для этой версии bash. Тем не менее, вы можете удалить ее, и история будет работать хорошо. Этот способ также прекрасно работает для Bash v4.

  • установите she-bang как интерактивную и не забывайте об set -o history как упоминал Чепнер.

#!/bin/bash -i
set -o history

PS. history |tail -n2 |head -n1 не равна последней команде. это команда перед последней.

Обратите внимание, что если последние или предварительные команды были многострочными, они не вернут правильный результат.

Кстати, в консоли вы можете использовать !-2 для обозначения команды prelast вместо вашей странной конструкции. к сожалению, он не работает в сценарии оболочки даже в интерактивном режиме.

1

Это помогает?

lastCommand=$(`cat ~/.bash_history |tail -n2 |head -n1` | sed 's/[0-9]* //')

Или, может быть, это:

echo !!

В bash есть встроенные средства для предоставления последней команды

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .