Come fare in modo che gli script bash stampino ogni comando prima che venga eseguito?


88

Ad esempio, ho un semplice file bash

#!/bin/bash
cd ~/hello
ls

Come posso fare in modo che visualizzi tutti i comandi prima di eseguirlo? Proprio l'effetto opposto di "@echo off" negli script batch di Windows.


1
Per chi cerca quali sono le setopzioni, le puoi trovare in questa pagina di manuale .
mkobit,

Puoi semplicemente estendere #!/bin/bash -x
Shebang in

Risposte:


110
bash -x script

o

set -x

nella sceneggiatura.

È possibile deselezionare nuovamente l'opzione con set +x. Se vuoi solo farlo per alcuni comandi puoi usare una subshell: `(set -x; command1; command; ...;)


L'ho sempre usato con grande efficacia. L'output sembra un po 'più sporco di quanto ci si possa aspettare prima.
Scott Pack

2
Impostando PS4è possibile modificare il prompt di -x. Ad esempio: PS4='Line $LINENO @ $(date +%s.%N): ' bash -x script( daterallenterà, però)
Walter Tross,

23

Questi funzionano anche:

set -v

o

#!/bin/bash -v

Ma -v non stampa la stringa PS4 prima di ogni riga di script e non traccia i passaggi di un'istruzione "for" (ad esempio) individualmente. Fa eco ai commenti mentre -x no.

Ecco un esempio dell'output usando -v:

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

echo hello
hello

Ecco il risultato dello stesso script con -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

Nota che ho incluso "echo -n" per aggiungere enfasi alle differenze tra -v e -x. Inoltre, -v è lo stesso di "-o verbose", ma quest'ultimo sembra non funzionare come parte di uno shebang.


Grande spiegazione! senza fare alcuna ricerca, mi sembra che Verbose ed eXplicit siano ciò che rappresentano queste due lettere.
Ape-inago,

Penso che -x sia più vicino a eXecute.
Steven Parkes,

10

Questo dovrebbe funzionare anche:

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

6

Questo dovrebbe funzionare:

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

4

set -o xtracee set +o xtracesono i tuoi amici (è più dettagliato, di -o verbose, e l'output va a STDERR, al contrario di dettagliato, che sembra accedere a STDOUT).

Vedi altri suggerimenti qui


3

Ci sono alcuni modi.

#!/usr/bin/env bash -x

come la linea shebang.

Includere set -xnello stesso script abiliterà la funzionalità mentre set +xla disabiliterà. Entrambi questi metodi funzioneranno anche con lo sh shell più portatile.

Se ricordo bene, perl ha anche l'opzione -x.


1

va come

language -x script

lingua = python, perl, bash -x = operatore script = nome file

spero che sia d'aiuto.


3
-xnon ha nulla a che fare con l'eco in Python
Eugene Pankov,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.