Повернути останню команду, виконану в shell-скрипті


6

У bash-скрипті я хотів би отримати останню команду, яка була виконана. У самому баші наступна команда працює як шарм.

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

Всередині скриптів, однак історія взагалі не працює.

Чи є спосіб отримати команду всередині сценарію?

Відповіді:


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 v4.

  • встановіть set -o historyShe -bang як інтерактивний і не забувайте про те, як згадував Чепнер.

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

PS. history |tail -n2 |head -n1не дорівнює останній команді. це команда перед останньою.

Зверніть увагу, якщо останні чи попередні команди були багаторядковими, це не поверне правильний результат.

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


Історія все ще не працює навіть при встановленні оболонки на #! / Bin / bash -i, можливо, це тому, що сценарій запускається через Ant?
Хедж

До своєї відповіді я додав простий exapmle. Це повинно працювати у вас. Будь ласка, спробуйте. Може бути проблема в командах після історії?
пік

У мене є GNU bash, версія 3.2.48 (1) -release (x86_64-apple-darwin11), я також спробував просту історію без аргументів, і вона не працює.
Хедж

Ого. в bash v3 (і в v4 теж) ви можете просто видалити she-bang і історія буде працювати досить добре.
пік

Розширення історії - лише одна функція, включена за замовчуванням в інтерактивній оболонці. Замість використання -i, просто використовуйте, set -o historyщоб спеціально увімкнути розширення історії у вашому сценарії.
чепнер

1

Чи допомагає це?

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

А може це:

echo !!

Як bash мають вбудовані засоби для надання останньої команди


1
!!дорівнює останній команді. Однак побудова ОП дорівнює команді безпосередньо перед останньою. !-2точно дорівнює будівництву ОП. На жаль, обидва !!і !-2не працюють всередині скрипту оболонки.
пік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.