it-swarm.it

Cosa significa "$?" ci dai esattamente nello script di Shell?

Ho visto il codice scritto da qualche parte online e volevo sapere cosa fa esattamente "$?" do/dacci . Googling non ha aiutato.

Ecco il codice in cui l'ho visto:

#!/bin/sh

ping -c 2 localhost
if [ $? != 0 ] ; then
    echo "Couldn't ping localhost, weird"
    fi

ping -c 2 veryweirdhostname.noend 
if [ $? != 0 ] ; then
    echo "Surprise, Couldn't ping a very weird hostname.."
    fi

echo "The pid of this process is $$"

Tratto da: http://efod.se/writings/linuxbook/html/Shell-scripts.html

25
Khushman Patel

$? è una variabile che contiene il valore di ritorno dell'ultimo comando eseguito.

Programma di esempio C (example.c):

int main() { return 1; }

Esempio di Bash:

gcc -o example example.c
./example
echo $? # prints 1
35
Brendan Long

La maggior parte delle risposte manca un po 'di dettagli. Una risposta definitiva si trova nello standard POSIX per Shell, nella sezione relativa ai parametri speciali :

$? Si espande allo stato di uscita decimale della pipeline più recente (vedi Pipelines).

Non essere sorpreso dalla parola pipeline, perché anche un semplice comando come ls è grammaticalmente una pipeline costituita da un singolo comando. Ma allora, cos'è $? per una pipeline a più comandi? È lo stato di uscita del comando last nella pipeline.

E che ne è delle condotte in esecuzione in background, come grep foo bigfile|head -n 10 > result &

Il loro stato di uscita può essere recuperato tramite wait una volta terminato l'ultimo comando della pipeline . Il processo in background pid è disponibile come $! e $? segnala solo se il comando di background è stato correttamente started.

Un altro dettaglio degno di nota è che lo stato di uscita è di solito nell'intervallo da 0 a 255, con 128 a 255 che indica il processo uscito a causa di un segnale. È probabile che il ritorno di altri valori da un programma C non venga riflesso in modo accurato in $?.

12
Jens

È il codice di ritorno del comando eseguito più recentemente.

Per convenzione 0 è un'uscita riuscita e diversa da zero indica un qualche tipo di errore.

6
evil otto

Questa variabile speciale mostra lo stato di uscita dell'ultimo comando eseguito in uno script o riga di comando. Ad esempio, in una riga di comando, l'utente potrebbe digitare

 who; echo $?

L'output sarebbe quindi

 user  tty7         2014-07-13 19:47
 0

Questo mostra l'output di who e lo stato di uscita del comando. Una sceneggiatura sarebbe la stessa.

 #!/bin/bash
 who
 echo $?

Uscita: 0

1
user1744127

le altre risposte coprono abbastanza bene Bash, ma non specifichi una Shell nella tua domanda. In csh (e tcsh) $? può essere usato per interrogare l'esistenza di variabili , ad es.

if $?my_var then
    echo my_var exists
endif
0
craq