Я намагаюся повторити останню команду, виконану всередині сценарію bash. Я знайшов спосіб зробити це з деякими, history,tail,head,sed
які чудово працюють, коли команди представляють певний рядок у моєму сценарії з точки зору аналізатора. Однак за деяких обставин я не отримую очікуваний результат, наприклад, коли команда вставляється всередину case
оператора:
Сценарій:
#!/bin/bash
set -o history
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
case "1" in
"1")
date
last=$(echo `history |tail -n2 |head -n1` | sed 's/[0-9]* //')
echo "last command is [$last]"
;;
esac
Вихід:
Tue May 24 12:36:04 CEST 2011
last command is [date]
Tue May 24 12:36:04 CEST 2011
last command is [echo "last command is [$last]"]
[Q] Чи може хтось допомогти мені знайти спосіб повторити команду останнього запуску незалежно від того, як / де ця команда викликається в сценарії bash?
Моя відповідь
Незважаючи на дуже вдячний внесок моїх колег SO'ers, я зупинив свій вибір на написанні run
функції - яка запускає всі її параметри як одну команду і відображає команду та код її помилки, коли вона виходить з ладу - з такими перевагами: -
Мені потрібно лише додати команди, які я хочу перевірити, за допомогою run
яких вони тримаються в одному рядку і не впливають на лаконічність мого сценарію
-Кожного разу, коли сценарій не вдається виконати одну з цих команд, останній рядок виводу мого сценарію є повідомленням, яке чітко відображає, яка команда не працює разом із кодом виходу, що полегшує налагодження
Приклад сценарію:
#!/bin/bash
die() { echo >&2 -e "\nERROR: $@\n"; exit 1; }
run() { "$@"; code=$?; [ $code -ne 0 ] && die "command [$*] failed with error code $code"; }
case "1" in
"1")
run ls /opt
run ls /wrong-dir
;;
esac
Вихід:
$ ./test.sh
apacheds google iptables
ls: cannot access /wrong-dir: No such file or directory
ERROR: command [ls /wrong-dir] failed with error code 2
Я тестував різні команди з кількома аргументами, змінні bash як аргументи, аргументи у цитатах ... і run
функція їх не порушувала. Єдине питання, яке я знайшов на даний момент, - це запустити ехо, яке ламається, але я все одно не планую перевіряти своє ехо.
run()
не працює належним чином, коли використовуються лапки, наприклад , це не вдається:run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
.