Ich arbeite an einem Shell-Skript, das einen komplexen Befehl aus Variablen erstellt, z. B. wie folgt (mit einer Technik, die ich aus den Bash-FAQ gelernt habe ):
#!/bin/bash
SOME_ARG="abc"
ANOTHER_ARG="def"
some_complex_command \
${SOME_ARG:+--do-something "$SOME_ARG"} \
${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
Dieses Skript fügt die Parameter dynamisch hinzu --do-something "$SOME_ARG"
und gibt --with "$ANOTHER_ARG"
an, some_complex_command
ob diese Variablen definiert sind. Bisher funktioniert das gut.
Jetzt möchte ich den Befehl aber auch drucken oder protokollieren können, wenn ich ihn ausführe, beispielsweise wenn mein Skript in einem Debug-Modus ausgeführt wird. Wenn mein Skript ausgeführt wird some_complex_command --do-something abc --with def
, möchte ich diesen Befehl auch in einer Variablen haben, damit ich ihn z. B. im Syslog protokollieren kann.
In den Bash-FAQ wird eine Technik demonstriert, mit der der DEBUG
Trap und die $BASH_COMMAND
Variable (z. B. für Debugging-Zwecke) für diesen Zweck verwendet werden. Ich habe das mit folgendem Code versucht:
#!/bin/bash
ARG="test string"
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"
echo "Command was: ${COMMAND}"
Dies funktioniert, erweitert jedoch nicht die Variablen im Befehl:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Ich denke , ich habe eval verwenden zu erweitern , echo "$ARG"
um echo test string
(zumindest habe ich nicht einen Weg ohne gefunden eval
noch) nicht . Folgendes funktioniert:
eval echo "Command was: ${COMMAND}"
Es wird die folgende Ausgabe erzeugt:
host ~ # ./test.sh
test string
Command was: echo "$ARG"
Command was: echo test string
Aber ich bin mir nicht sicher, ob ich so eval
sicher arbeiten kann . Ich habe erfolglos versucht, einige Dinge auszunutzen:
#!/bin/bash
ARG="test string; touch /x"
DANGER='$(touch /y; cat /etc/shadow)'
trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG" $DANGER
echo "Command was: ${COMMAND}"
eval echo "Command was: ${COMMAND}"
Es scheint gut damit umzugehen, aber ich bin neugierig, ob jemand anderes ein Problem sieht, das ich verpasst habe.