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.


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; ...;)


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.


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

6

Das sollte funktionieren:

set -o verbose #echo on
...
set +o verbose #echo off

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


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.


1

geht wie

language -x script

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

ich hoffe es hilft.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.