Я пытаюсь повторить последний запуск команды внутри bash script. Я нашел способ сделать это с помощью history,tail,head,sed
, который отлично работает, когда команды представляют определенную строку в моем script с точки зрения парсера. Однако в некоторых случаях я не получаю ожидаемый результат, например, когда команда вставлена внутри оператора case
:
script:
#!/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 script?
Мой ответ
Несмотря на то, что мои коллеги из SO'ers высоко оценили меня, я решил написать функцию run
, которая запускает все свои параметры как одну команду и отображает команду и код ее ошибки при ее отсутствии - со следующими преимуществами:
- Мне нужно только добавить команды, которые я хочу проверить, с помощью run
, которая хранит их в одной строке и не влияет на кратность моего script
-Whenever script не работает с одной из этих команд, последняя выходная строка моего script - это сообщение, в котором четко отображается, какая команда выходит из строя вместе с кодом выхода, что облегчает отладку
Пример script:
#!/bin/bash
die() { echo >&2 -e "\nERROR: [email protected]\n"; exit 1; }
run() { "[email protected]"; 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
не нарушала их. Единственная проблема, которую я нашел до сих пор, - это запустить эхо, которое ломается, но я все равно не планирую проверять свои эхо.