it-swarm.com.de

Wie kann man Bash-Skripte dazu bringen, jeden Befehl auszudrucken, bevor er ausgeführt wird?

Zum Beispiel habe ich eine einfache Bash-Datei

#!/bin/bash
cd ~/hello
ls

Wie kann ich dafür sorgen, dass jeder Befehl angezeigt wird, bevor er ausgeführt wird? Genau das Gegenteil von "@echo off" in Windows Batch Scripting.

90
Epeius
bash -x script

oder

set -x

im Skript.

Sie können die Option mit set +x Wieder deaktivieren. Wenn Sie dies nur für einige Befehle tun möchten, können Sie eine Unterschale verwenden: `(set -x; command1; command; ...;)

114
Steven Parkes

Diese funktionieren auch:

set -v

oder

#!/bin/bash -v

-V druckt die PS4-Zeichenfolge jedoch nicht vor jeder Skriptzeile und verfolgt die Schritte einer "for" -Anweisung (zum Beispiel) nicht einzeln. Es gibt Echo-Kommentare aus, während -x dies nicht tut.

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. -V ist auch dasselbe wie "-o verbose", aber letzteres scheint nicht als Teil eines Shebang zu funktionieren.

Dies sollte auch funktionieren:

#!/bin/bash -x
cd ~/hello
ls
10
tomoe

Das sollte funktionieren:

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

set -o xtrace und set +o xtrace sind deine Freunde (es ist ausführlicher als -o verbose, und die Ausgabe geht an STDERR, im Gegensatz zu verbose, das bei STDOUT zu protokollieren scheint).

Weitere Tipps hier

4
pihentagy

Es gibt einige Möglichkeiten.

#!/usr/bin/env bash -x

als die Shebang Linie.

Einschließlich set -x im Skript selbst aktiviert die Funktionalität, während set +x wird es deaktivieren. Beide Methoden funktionieren auch mit der tragbareren sh-Shell.

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

3
user6784

geht wie

language -x script

language = python, Perl, bash -x = operator script = filename

ich hoffe es hilft.

1
debuggerpk

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

0
Rory