Wie kann man Bash-Skripte veranlassen, jeden Befehl vor seiner Ausführung auszudrucken?

88

Zum Beispiel habe ich eine einfache Bash-Datei

#!/bin/bash
cd ~/hello
ls

Wie kann ich jeden Befehl anzeigen lassen, bevor ich ihn ausführe? Genau der gegenteilige Effekt von "@echo off" beim Windows Batch Scripting.

Epeius
quelle
1
Für diejenigen, die nach den setOptionen suchen , finden Sie diese auf dieser Manpage .
Mkobit
Sie können Shebang einfach so verlängern#!/bin/bash -x
sobi3ch

Antworten:

110
bash -x script

oder

set -x

im Drehbuch.

Mit können Sie die Option wieder deaktivieren set +x. Wenn Sie nur ein paar Befehle ausführen möchten, können Sie eine Subshell verwenden: `(set -x; command1; command; ...;)

Steven Parkes
quelle
Ich habe das immer mit großer Wirkung eingesetzt. Die Ausgabe sieht etwas schmutziger aus, als Sie vielleicht zuerst erwarten.
Scott Pack
2
Durch die Einstellung können PS4Sie die Eingabeaufforderung von anpassen -x. ZB: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( datewird es aber verlangsamen)
Walter Tross
23

Diese funktionieren auch:

set -v

oder

#!/bin/bash -v

Aber -v gibt den PS4-String nicht vor jeder Skriptzeile aus und verfolgt die Schritte einer "for" -Anweisung (zum Beispiel) nicht einzeln. Es gibt Kommentare aus, -x hingegen nicht.

Hier ist ein Beispiel für die Ausgabe mit -v:

#!/bin/bash -v
# this is a comment
for i in {1..4}
do
    echo -n $i
done
1234echo

echo hello
hello

Hier ist das Ergebnis desselben Skripts mit -x:

+ for i in '{1..4}'
+ echo -n 1
1+ for i in '{1..4}'
+ echo -n 2
2+ for i in '{1..4}'
+ echo -n 3
3+ for i in '{1..4}'
+ echo -n 4
4+ echo

+ echo hello
hello

Beachten Sie, dass ich "echo -n" eingefügt habe, um die Unterschiede zwischen -v und -x hervorzuheben. Auch -v ist dasselbe wie "-o verbose", aber letzteres scheint nicht als Teil eines Shebang zu funktionieren.

Dennis Williamson
quelle
Tolle Erklärung! Ohne Nachforschungen anzustellen, sieht es für mich so aus, als ob Verbose und eXplicit das sind, wofür diese beiden Buchstaben stehen.
Ape-inago,
Ich denke -x ist näher an eXecute.
Steven Parkes
10

Dies sollte auch funktionieren:

#!/bin/bash -x
cd ~/hello
ls
Tomoe
quelle
6

Das sollte funktionieren:

set -o verbose #echo on
...
set +o verbose #echo off
splattne
quelle
4

set -o xtraceund set +o xtracesind deine Freunde (es ist ausführlicher als -o verbose, und die Ausgabe geht an STDERR, im Gegensatz zu ausführlich, was anscheinend an STDOUT protokolliert wird).

Weitere Tipps finden Sie hier

pihentagy
quelle
3

Es gibt einige Möglichkeiten.

#!/usr/bin/env bash -x

als die Shebang-Linie.

Wenn Sie set -xdas Skript selbst einbinden, wird die Funktionalität aktiviert und set +xdeaktiviert. Beide Methoden funktionieren auch mit der portableren sh-Shell.

Wenn ich mich richtig erinnere, hat Perl auch die Option -x.

user6784
quelle
1

geht wie

language -x script

language = Python, Perl, Bash -x = Operator script = Dateiname

ich hoffe es hilft.

debuggerpk
quelle
3
-xhat nichts mit Echo in Python zu tun
Eugene Pankov
0

#! /bin/bash -x macht was du willst.

Rory
quelle