Qual è il significato di $? in uno script di shell?


Risposte:



26

La risposta di Cjm è corretta, ma $?può essere usata in modo sciocco negli script di shell, e vorrei metterti in guardia. Molti script di shell non validi hanno un modello ripetuto di codice:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Se possibile (problemi di leggibilità a volte intrusi), dovresti codificare questa situazione in modo diverso:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Quest'ultimo utilizzo è più veloce, non contamina lo spazio dei nomi delle variabili della shell con ciò che equivale a variabili temporanee, spesso può essere molto più leggibile per l'uomo e incoraggia l'uso della "logica positiva", la pratica di scrivere condizionali senza negazioni, che ha cognizioni semplicità nella maggior parte delle situazioni. Elimina $?gran parte dell'uso di .


5
Una sintassi più complicata è necessaria quando ci sono più possibilità rispetto a solo 0 o 1: i programmi spesso comunicano informazioni utili attraverso i codici di uscita. Ed è anche utile se è necessario riutilizzare quel valore in un secondo momento nel codice (ad esempio per la registrazione).
Mattdm,

3

Oltre a quanto detto da cjm , se il valore di $?è 0, il processo precedente è terminato normalmente (o correttamente). Altrimenti si è verificato un errore.


8
Non segnala sempre un errore. diffesce con uno 0 se i file confrontati sono uguali, con uno se sono diversi e 2 è un errore.
Shawn J. Goff,

2
Non segnala mai un errore. È solo lo stato di uscita del comando precedente. La cosa "0 se uscita normale" è una convenzione (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg

3

$?-Lo stato di uscita dell'ultimo comando eseguito.

$0-Il nome del file dello script corrente.

$#-Il numero di argomenti forniti a uno script.

$$-Il numero di processo della shell corrente. Per gli script di shell, questo è l'ID del processo con cui vengono eseguiti.


0

$? forniscici lo stato di esecuzione dell'ultimo comando di esecuzione al prompt. Il valore '0' indica che il comando è stato eseguito correttamente e '1' non è riuscito.


2
Non solo su prompt interattivi, ma anche negli script e qualsiasi valore diverso da zero indica un errore.
Kusalananda

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.