1299 Stimmen

Wie man Shell-Befehle bei der Ausführung echot, wenn sie ausgeführt werden

Wie kann ich in einem Shell-Skript alle aufgerufenen Shell-Befehle als Echo ausgeben und alle Variablennamen erweitern?

Ein Beispiel ist die folgende Zeile:

ls $DIRNAME

Ich möchte, dass das Skript den Befehl ausführt und das Folgende anzeigt

ls /full/path/to/some/dir

Der Zweck ist, ein Protokoll aller aufgerufenen Shell-Befehle und ihrer Argumente zu speichern. Gibt es vielleicht eine bessere Möglichkeit, ein solches Protokoll zu erstellen?

47voto

Afriza N. Arief Punkte 7156

Nach Angaben von TLDP 's Bash-Anleitung für Einsteiger: Kapitel 2. Skripte schreiben und debuggen :

2.3.1. Debugging für das gesamte Skript

$ bash -x script1.sh

...

Es gibt jetzt einen vollwertigen Debugger für Bash, verfügbar unter SourceForge . Diese Debugging-Funktionen sind in den meisten modernen Versionen der Bash ab Version 3.x verfügbar.

2.3.2. Fehlersuche in Teilen des Skripts

set -x            # Activate debugging from here
w
set +x            # Stop debugging from here

...

Tabelle 2-1. Überblick über die eingestellten Debugging-Optionen

    Short  | Long notation | Result
    -------+---------------+--------------------------------------------------------------
    set -f | set -o noglob | Disable file name generation using metacharacters (globbing).
    set -v | set -o verbose| Prints shell input lines as they are read.
    set -x | set -o xtrace | Print command traces before executing command.

...

Alternativ können diese Modi auch im Skript selbst angegeben werden, indem indem Sie die gewünschten Optionen in der ersten Zeile der Shell-Deklaration hinzufügen. Die Optionen können kombiniert werden, wie es bei UNIX-Befehlen der Fall ist:

#!/bin/bash -xv

38voto

nooj Punkte 544

Eine andere Möglichkeit ist, "-x" am Anfang des Skripts statt in der Befehlszeile einzugeben:

$ cat ./server
#!/bin/bash -x
ssh user@server

$ ./server
+ ssh user@server
user@server's password: ^C
$

38voto

RenRen Punkte 9430

Sie können ausführen. ein Bash-Skript im Debug-Modus mit der Option -x Option .

Dadurch werden alle Befehle als Echo ausgegeben.

bash -x example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

Sie können auch die Option -x im Skript speichern . Geben Sie einfach die -x Option in dem Paket.

######## example_script.sh ###################
#!/bin/bash -x

cd /home/user
mv text.txt mytext.txt

##############################################

./example_script.sh

# Console output
+ cd /home/user
+ mv text.txt mytext.txt

23voto

Phani Rithvij Punkte 3119

Wenn man alle Antworten kombiniert, ist dies die beste und einfachste

# https://stackoverflow.com/a/64644990/8608146
exe(){
    set -x
    "$@"
    { set +x; } 2>/dev/null
}
# example
exe go generate ./...

{ set +x; } 2>/dev/null de https://stackoverflow.com/a/19226038/8608146

Wenn der Exit-Status des Befehls benötigt wird, wie erwähnt aquí

Verwenden Sie

{ STATUS=$?; set +x; } 2>/dev/null

Und verwenden Sie die $STATUS später wie exit $STATUS am Ende

Ein etwas nützlicheres Beispiel

# https://stackoverflow.com/a/64644990/8608146
_exe(){
    [ $1 == on  ] && { set -x; return; } 2>/dev/null
    [ $1 == off ] && { set +x; return; } 2>/dev/null
    echo + "$@"
    "$@"
}
exe(){
    { _exe "$@"; } 2>/dev/null
}

# examples
exe on # turn on same as set -x
echo This command prints with +
echo This too prints with +
exe off # same as set +x
echo This does not

# can also be used for individual commands
exe echo what up!

22voto

Alan Punkte 1427

Geben Sie "bash -x" in die Befehlszeile ein, bevor Sie den Namen des Bash-Skripts eingeben. Um zum Beispiel foo.sh auszuführen, geben Sie ein:

bash -x foo.sh

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X