Wie kann ich in einem Shell-Skript alle aufgerufenen Shell-Befehle wiedergeben und Variablennamen erweitern?
Zum Beispiel in der folgenden Zeile:
ls $DIRNAME
Ich möchte, dass das Skript den Befehl ausführt und Folgendes anzeigt
ls /full/path/to/some/dir
Der Zweck besteht darin, ein Protokoll aller aufgerufenen Shell-Befehle und ihrer Argumente zu speichern. Gibt es vielleicht eine bessere Möglichkeit, ein solches Protokoll zu erstellen?
set -x
wird dir geben, was du willst.Hier ist ein Beispiel für ein Shell-Skript, das Folgendes demonstriert:
Dies erweitert alle Variablen und druckt die vollständigen Befehle vor der Ausgabe des Befehls.
Ausgabe:
quelle
set -o verbose
oderset -v
(nur "ausführlich") oderset -o xtrace
oderset -x
(nur "xtrace") oderset -xv
(beide) oderset -o xtrace -o verbose
(beide) tun .Ich benutze eine Funktion, um den Befehl zu wiederholen und auszuführen:
Welche Ausgänge
Für kompliziertere Befehlspipes usw. können Sie eval verwenden:
Welche Ausgänge
quelle
++ set +x
Ausgabe im ausgeschalteten Zustand und sieht sauberer aus. Für nur ein oder zwei Aussagen ist die Antwort von bhassel mit einer Unterschale am bequemsten.set +x
, es betrifft alle Befehle, was zu viel ist!cp "foo bar" baz
undcp foo "bar baz"
unterscheiden. Es ist also gut, um einem Benutzer Fortschrittsinformationen anzuzeigen. weniger für das Debuggen der Ausgabe oder das Aufzeichnen reproduzierbarer Befehle. Verschiedene Anwendungsfälle. Inzsh
können Sie das Zitieren mit dem:q
Modifikator beibehalten :exe() { echo '$' "${@:q}" ; "$@" ; }
eval
aus Ihrem Befehl. Erwarten Sie also nicht, dass es richtig funktioniertexe eval "echo 'eval world'"
!Sie können dies auch für ausgewählte Zeilen in Ihrem Skript umschalten, indem Sie sie einschließen
set -x
undset +x
beispielsweisequelle
Die Antwort von shuckc für das Echo ausgewählter Zeilen hat einige Nachteile: Am Ende wird auch der folgende
set +x
Befehl wiederholt, und Sie verlieren die Möglichkeit, den Exit-Code zu testen,$?
da er von der überschrieben wirdset +x
.Eine andere Möglichkeit besteht darin, den Befehl in einer Subshell auszuführen:
Das gibt Ihnen Ausgabe wie:
Dies verursacht jedoch den Aufwand für das Erstellen einer neuen Subshell für den Befehl.
quelle
++ set +x
Ausgabe zu vermeiden .if [ $? -eq 0 ]
durchif (set -x; COMMAND)
.Eine andere Möglichkeit besteht darin, "-x" am Anfang Ihres Skripts anstatt in der Befehlszeile einzufügen:
quelle
./myScript
und nicht genau gleich zu funktionieren scheintbash myScript
. Trotzdem eine gute Sache, danke.Nach TLDP ‚s Bash Leitfaden für Anfänger: Kapitel 2. Schreiben und Debuggen von Skripten :
quelle
Geben Sie "bash -x" in die Befehlszeile vor dem Namen des Bash-Skripts ein. Geben Sie zum Ausführen von foo.sh beispielsweise Folgendes ein:
quelle
Mit der Option können Sie ein Bash-Skript im Debug-Modus ausführen .
-x
Dadurch werden alle Befehle wiedergegeben.
Sie können die Option -x auch im Skript speichern .
-x
Geben Sie einfach die Option im Shebang an.quelle
bash -vx
wird das gleiche tun, aber ohne variable InterpolationFür zsh echo
Und zum Debuggen,
quelle
Für
csh
undtcsh
können Sieset verbose
oderset echo
(oder Sie können sogar beide festlegen, dies kann jedoch die meiste Zeit zu Duplikaten führen).Die
verbose
Option gibt so ziemlich den genauen Shell-Ausdruck aus, den Sie eingeben.Die
echo
Option zeigt eher an, was durch das Laichen ausgeführt wird.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
quelle
Die Ausgabe ist wie folgt:
quelle
Damit zusammengesetzte Befehle wiedergegeben werden können, verwende ich
eval
dieexe
Funktion von plus Soth, um den Befehl wiederzugeben und auszuführen. Dies ist nützlich für Piped-Befehle, bei denen sonst nur keiner oder nur der erste Teil des Piped-Befehls angezeigt wird.Ohne Bewertung:
Ausgänge:
Mit eval:
Welche Ausgänge
quelle