Я пытаюсь повторить последнюю команду, запущенную внутри сценария 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, я решил написать 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 ""
.