Cosa fa `set -x`?


261

Ho uno script di shell con la seguente riga:

[ "$DEBUG" == 'true' ] && set -x

15
Dai un'occhiata:help -m set | less
Ciro

4
Grazie per il help -m setsuggerimento. Che funzioni. Ho provato man setprima di chiedere, tuttavia su Ubuntu c'èNo manual entry for set
Ole

2
@Ole, setè integrato in bash, quindi se lo man bashtrovi nella sezione COMANDI INCORPORATI SHELL. Quando si visualizza la pagina man probabilmente si può saltare con una ricerca per questo regexp: \bset \[.
Utente 5910

Risposte:


365

set -xabilita una modalità della shell in cui tutti i comandi eseguiti sono stampati sul terminale. Nel tuo caso è chiaramente usato per il debug, che è un tipico caso d'uso per set -x: stampare ogni comando mentre viene eseguito può aiutarti a visualizzare il flusso di controllo dello script se non funziona come previsto.

set +x lo disabilita.


5
Come disabilitare di nuovo quella funzione?
feedc0de,

85
@DanielBrunner: lo set +xdisabilita.
John Zwinck,

2
Questo è MOLTO utile! Vorrei che qualcuno me lo avesse detto prima. Ci sono altri trucchi interessanti come questo che possono aumentare la nostra meta-abilità nello scripting?
Studente

7
@Student: set -enella parte superiore dello script, lo script verrà chiuso con un errore ogni volta che si verifica un errore (e non viene gestito in modo esplicito). Lo trovo immensamente preferibile al valore predefinito, che è quello di andare avanti volenti o nolenti (come il famigerato di Visual Basic On Error Resume Next).
John Zwinck,

1
@JohnZwinck, sfortunatamente, set -eha effetti collaterali molto indesiderati, al punto da rendere quasi impossibile la revisione del codice (perché il comportamento di una determinata linea dipende da cosa succede nello stack di chiamate - se una funzione viene chiamata in un contesto "controllato", set -eè disabilitata per quell'invocazione e tutto ciò che a sua volta chiama). Vedi gli esercizi in BashFAQ # 105 .
Charles Duffy,

78

set -x

Stampa una traccia di comandi semplici, per comandi, comandi di caso, comandi di selezione e aritmetica per i comandi e i loro argomenti o elenchi di parole associati dopo che sono stati espansi e prima che vengano eseguiti. Il valore della variabile PS4 viene espanso e il valore risultante viene stampato prima del comando e dei suoi argomenti espansi.

[ fonte ]

Esempio

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

L'esempio sopra illustra l'uso di set -x . Quando viene utilizzato, l'espressione aritmetica sopra è stata espansa. Abbiamo potuto vedere come una riga singola è stata valutata passo dopo passo.

  • Il primo passo exprè stato valutato.
  • Secondo passo echo è stato valutato.

Per saperne di più su set → visita questo link

quando si tratta del tuo script di shell,

[ "$DEBUG" == 'true' ] && set -x

Lo script potrebbe aver stampato alcune righe di informazioni aggiuntive quando la modalità di esecuzione è stata selezionata come DEBUG. Tradizionalmente le persone usavano abilitare la modalità debug quando uno script veniva chiamato con argomento opzionale come-d



6

-u: disabilitato per impostazione predefinita. Se attivato, viene visualizzato un messaggio di errore quando si utilizza una variabile non configurata.

-v: inattivo per impostazione predefinita. Dopo l'attivazione, il contenuto originale delle informazioni verrà visualizzato (senza risoluzione variabile) prima che le informazioni vengano trasmesse.

-x: inattivo per impostazione predefinita. Se attivato, il contenuto del comando verrà visualizzato prima dell'esecuzione del comando (dopo la risoluzione variabile, c'è un simbolo ++).

Confronta le seguenti differenze:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
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.