Ich versuche, den letzten Befehl in einem Bash-Skript wiederzugeben. Ich habe einen Weg gefunden, dies mit einigen zu tun, history,tail,head,sed
der gut funktioniert, wenn Befehle eine bestimmte Zeile in meinem Skript vom Parser-Standpunkt aus darstellen. Unter bestimmten Umständen erhalte ich jedoch nicht die erwartete Ausgabe, beispielsweise wenn der Befehl in eine case
Anweisung eingefügt wird :
Das Skript:
#!/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
Die Ausgabe:
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]"]
[F] Kann mir jemand helfen, einen Weg zu finden, den letzten Ausführungsbefehl wiederzugeben, unabhängig davon, wie / wo dieser Befehl im Bash-Skript aufgerufen wird?
Meine Antwort
Trotz der sehr geschätzten Beiträge meiner SO'-Kollegen habe ich mich dafür entschieden, eine run
Funktion zu schreiben, die alle ihre Parameter als einen einzigen Befehl ausführt und den Befehl und seinen Fehlercode anzeigt, wenn er fehlschlägt - mit den folgenden Vorteilen:
-Ich muss nur Stellen Sie den Befehlen, mit run
denen ich prüfen möchte,
voran, wodurch sie in einer Zeile bleiben und die Prägnanz meines Skripts nicht beeinträchtigt wird. Wenn das Skript bei einem dieser Befehle fehlschlägt, ist die letzte Ausgabezeile meines Skripts eine Meldung, die deutlich anzeigt, welcher Befehl angezeigt wird schlägt zusammen mit dem Exit-Code fehl, was das Debuggen erleichtert
Beispielskript:
#!/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
Die Ausgabe:
$ ./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
Ich habe verschiedene Befehle mit mehreren Argumenten getestet, Bash-Variablen als Argumente, Argumente in Anführungszeichen ... und die run
Funktion hat sie nicht gebrochen. Das einzige Problem, das ich bisher gefunden habe, ist das Ausführen eines Echos, das unterbrochen wird, aber ich habe sowieso nicht vor, meine Echos zu überprüfen.
run()
dies nicht richtig funktioniert, wenn Anführungszeichen verwendet werden. Dies schlägt beispielsweise fehl :run ssh-keygen -t rsa -C info@example.org -f ./id_rsa -N ""
.