Próbuję powtórzyć ostatnie polecenie uruchomione w skrypcie bash. Znalazłem sposób, aby to zrobić z niektórymi, history,tail,head,sed
które działają dobrze, gdy polecenia reprezentują określoną linię w moim skrypcie z punktu widzenia parsera. Jednak w pewnych okolicznościach nie otrzymuję oczekiwanego wyniku, na przykład gdy polecenie jest wstawione do case
instrukcji:
Scenariusz:
#!/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
Wyjście:
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] Czy ktoś może mi pomóc znaleźć sposób na powtórzenie ostatniego polecenia uruchomienia, niezależnie od tego, jak / gdzie to polecenie jest wywoływane w skrypcie bash?
Moja odpowiedź
Pomimo bardzo cenionego wkładu ze strony moich kolegów SO'ów, zdecydowałem się napisać run
funkcję - która uruchamia wszystkie swoje parametry jako jedno polecenie i wyświetla polecenie oraz kod błędu, gdy się nie powiedzie - z następującymi korzyściami:
- Muszę tylko dołącz polecenia, które chcę sprawdzić, run
co utrzymuje je w jednym wierszu i nie wpływa na zwięzłość mojego skryptu
-Gdy skrypt zawiedzie jedno z tych poleceń, ostatnim wierszem wyjściowym mojego skryptu jest komunikat, który wyraźnie wyświetla, które polecenie kończy się niepowodzeniem wraz z kodem zakończenia, co ułatwia debugowanie
Przykładowy skrypt:
#!/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
Wyjście:
$ ./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
Przetestowałem różne polecenia z wieloma argumentami, zmiennymi bash jako argumentami, argumentami w cudzysłowach ... i run
funkcja ich nie złamała. Jedynym problemem, jaki do tej pory znalazłem, jest uruchomienie echa, które się psuje, ale i tak nie planuję sprawdzać swoich ech.
run()
nie działa prawidłowo, gdy używane są cytaty, na przykład ten nie powiedzie się:run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
.