Я пытаюсь повторить последний запуск команды внутри скрипта 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 в качестве аргументов, аргументы в кавычках ... и *Функция 1031 * не сломала их.Единственная проблема, которую я нашел до сих пор, - это запустить эхо, которое прерывается, но я все равно не планирую проверять свое эхо.