Wie auf echo-shell-Befehle auszuführen, wie Sie ausgeführt werden
In ein shell-Skript, wie kann ich das echo aller shell-Kommandos genannt und erweitern, alle Variablen-Namen?
Beispielsweise erhalten Sie die folgende Zeile:
ls $DIRNAME
Ich würde gerne den script um den Befehl auszuführen und anzuzeigen, die folgende
ls /full/path/to/some/dir
Der Zweck ist, speichern Sie ein Protokoll der alle shell-Befehle genannt und Ihre Argumente. Gibt es vielleicht eine bessere Methode für die Generierung solch einem log?
Du musst angemeldet sein, um einen Kommentar abzugeben.
set -x
oderset -o xtrace
erweitert Variablen und druckt eine kleine + - Zeichen vor der Zeile.set -v
oderset -o verbose
nicht erweitern Sie die Variablen vor dem Druck.Verwenden
set +x
undset +v
zum deaktivieren der oben genannten Einstellungen.In der ersten Zeile des Skripts kann man
#!/bin/sh -x
(oder-v
), um den gleichen Effekt wieset -x
(oder-v
) weiter unten im Skript.Den oben genannten funktioniert auch mit
/bin/sh
.Finden Sie in der bash-Hacker' wiki auf
set
- Attribute, und auf debugging.set -x
geben wird, was Sie wollen.Hier ist ein Beispiel-shell-script zu demonstrieren:
Diese erweitert alle Variablen und druckt die full-Befehle vor der Ausgabe des Befehls.
Ausgabe:
set -o verbose
oderset -v
(nur "verbose") oderset -o xtrace
oderset -x
(nur "xtrace") oderset -xv
(beide) oderset -o xtrace -o verbose
(beide).Können Sie auch schalten Sie diese für ausgewählte Zeilen in Ihr Skript durch das einwickeln von Ihnen in
set -x
undset +x
z.B.Ich eine Funktion verwenden, um echo und führen dann den Befehl
Welche Ausgänge
Edit:
Weitere komplizierte Befehle Rohre etc kann man mit eval:
Welche Ausgänge
++ set +x
- Ausgang als ausgeschaltet, als auch auf der Suche cleaner. Für nur eine einzelne Anweisung oder zwei, obwohl, bhassel die Antwort, die die Verwendung einer subshell ist die bequemste.set +x
es betrifft alle Befehle, die ist zu viel!cp "foo bar" baz
undcp foo "bar baz"
zum Beispiel. So ist es gut für die Anzeige von Informationen zum Fortschritt eines Benutzers; weniger für die debugging-Ausgabe oder Aufzeichnung reproduzierbar Befehle. Verschiedene use-cases. Inzsh
, Sie können bewahren Sie zitiert mit der:q
modifier:exe() { echo '$' "${@:q}" ; "$@" ; }
exe foo=bar; echo $foo
wird nicht funktionieren.| tee -a $LOGFILE
zum Ausdruck tun std-Ausgang und die log-Datei als gut.exe (cut -d ' ' -f9,10 --complement ${folder}/hog_crop_px.txt) | paste - ${folder}/lbp_crop_px.txt > ${folder}/crop_px.tx
gibt mirsyntax error near unexpected token
cut", obwohl es führt perfekt ohne die exe-Datei () - Befehl. Jede Anregung?exe eval"(cut -d ' ' -f9,10 --complement ${folder}/hog_crop_px.txt) | paste - ${folder}/lbp_crop_px.txt > ${folder}/crop_px.tx"
- - - - - - ODER - - - - - -exe cut -d ' ' -f9,10 --complement ${folder}/hog_crop_px.txt | paste - ${folder}/lbp_crop_px.txt > ${folder}/crop_px.tx
exe eval 'foo=bar; echo $foo'
funktioniert jetzteval
. Aber ich bin sicher, ich habe versucht, mit Ihrer ursprünglichen Funktion mit und ohne Klammern, bevor ich hier gepostet und dein zweites Beispiel funktioniert nicht.eval
von Ihrem Befehl. Also nicht erwarten, dass es richtig funktioniert aufexe eval "echo 'eval world'"
!shuckc Antwort für echo-wählen Sie Linien, hat ein paar Nachteile: Sie sind am Ende mit den folgenden
set +x
Befehl als echo, als auch, und Sie verlieren die Fähigkeit zu testen, den exit-code mit$?
da es überschrieben wird durch dieset +x
.Eine weitere option ist das ausführen des Befehls in einer subshell:
die geben Sie eine Ausgabe wie:
Dies bedeutet Aufwand für die Erstellung einer neuen subshell, für den Befehl, aber.
++ set +x
Ausgabe.if [ $? -eq 0 ]
mitif (set -x; COMMAND)
.Eine andere Möglichkeit ist, "- x" oben in deinem script statt auf der Kommandozeile:
(Unzureichende rep Kommentar auf die gewählte Antwort.)
./myScript
undbash myScript
. Noch eine gute Sache, um zu zeigen, danke.Laut TLDP's Bash Guide für Anfänger: Kapitel 2. Schreiben und Debuggen von Skripts
Typ "bash -x" auf der Befehl-Linie, bevor der name der bash-Skript. Zum Beispiel, ausführen foo.sh Typ:
Können Sie ausführen ein bash-Skript im debug-Modus mit der option-x.
Das echo werden alle Befehle.
Sie können auch speichern Sie die -x-option in das Skript. Nur die option-x angeben, in der shebang.
bash -vx
werde das gleiche tun, aber ohne Variablen-interpolationJemand oben geschrieben:
und dieser sieht vielversprechend aus, aber ich kann nicht für das Leben von mir herauszufinden, was es tut. Ich habe gegoogelt und gesucht, in der man bash-Seite für "\$" und "$@", und absolut nichts.
Verstehe ich eine Funktion erstellt wird, mit dem Namen "exec()". Ich verstehe die geschweifte-Klammern markieren den Anfang und das Ende der Funktion. Ich glaube, ich verstehe, dass das Semikolon markiert eine "harte Rückkehr" zwischen einem multi-line-Befehl, so dass '{ echo "\$ $@" ; "$@" ; }' wird, im wesentlichen:
Kann irgend jemand mir eine kurze Erklärung, oder wo man diese info, da offensichtlich mein google-fu versagt mir?
(Ohne Bedeutung, starten Sie eine neue Frage an einen alten thread, mein Ziel ist die Umleitung der Ausgabe in eine Datei. Die "set-x ; [Befehle] ; set +x" Methode wäre die Arbeit angemessen gut für mich, aber ich kann nicht herausfinden, wie das echo der Ergebnisse in eine Datei statt auf dem Bildschirm, so dass ich versuche zu verstehen, was dieser andere Methode, in der Hoffnung, ich könnte mich sehr schlecht verstehen Umleitung/Rohre/tee/etc, das gleiche zu tun.)
Dank!
SPÄTER BEARBEITEN:
Mit etwas Herumprobieren, ich glaube, dass ich es herausgefunden. Hier meine entsprechende code für das, was ich brauchte:
Die Ergebnisse in der logfile.txt Aussehen:
Genau das, was ich brauchte. Danke!
printf "%s\t$params" "$(date)" >> "$SCRIPT_LOG"
Für zsh echo
und zum Debuggen
Für
csh
undtcsh
können Sieset verbose
oderset echo
(oder Sie können sogar beide, aber es kann dazu führen, einige überschneidungen, die meisten der Zeit).Den
verbose
option druckt ziemlich genau die shell-Ausdruck, den Sie eingeben.Den
echo
option ist mehr Richtwert, was ausgeführt wird durch das laichen.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.
Damit für zusammengesetzte Befehle hallten, ich benutze
eval
plus Soth ' sexe
Funktion echo dann den Befehl ausführen. Dies ist nützlich für die weitergeleiteten Befehle, die sonst nur keiner oder nur der erste Teil der befehlspipeline.Ohne eval:
Ausgänge:
Mit eval:
Welche Ausgänge
Ausgabe ist wie folgt: