Che cos'è "$?"? È una variabile?


23

La domanda è piuttosto semplice. Posso ottenere il codice di uscita del comando precedente utilizzando $?. Ma cos'è esattamente?

Non penso che sia una variabile, perché non puoi avere caratteri speciali nel nome di una variabile diversa da _.

foo?foo=10

comporterà l'errore: foo?foo=10: command not found

Quindi se non è una variabile, che cos'è? Ce ne sono altri simili?


Risposte:


23

Che cos'è?

$? è una variabile incorporata che memorizza lo stato di uscita di un comando, una funzione o lo script stesso.

$?legge lo stato di uscita dell'ultimo comando eseguito. Dopo che una funzione ritorna, $?fornisce lo stato di uscita dell'ultimo comando eseguito nella funzione. Questo è il modo di Bash di dare alle funzioni un "valore di ritorno". Restituisce 0in caso di successo o un numero intero nell'intervallo 1 - 255in caso di errore.

Ci sono anche altri simili?

Sì, ci sono diverse variabili incorporate in bash. Puoi vedere un elenco qui . Consultare: http://www.tldp.org/LDP/abs/html/exit-status.html


1
Quindi è disponibile solo nella shell bash?
Daltonfury42,

4
@ daltonfury42 no, qualsiasi guscio che i tentativi di avere una certa compatibilità con la shell Bourne lo sosterrà (compresi dash, ksh, zsh, tra gli altri).
muru,

2
csh e pesce usano $statusper lo stesso scopo
glenn jackman,

22

$?è una variabile ma una speciale, ecco perché sono ammessi caratteri speciali. ($?)Si espande allo stato di uscita della pipeline in primo piano eseguita più di recente.

Non è l'unico, la shell tratta diversi parametri appositamente. Questi parametri possono solo essere referenziati; l'assegnazione a loro non è consentita:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

fonti:


2
"$*"non sono solo tutti i parametri posizionali come una singola parola, ma tutti i parametri posizionali separati dal primo carattere di IFScome una singola parola. Poiché il risultato sarà soggetto alla divisione del campo se non viene quotato, l'effetto è come se $@fosse usato nel caso non quotato.
Muru,

1
A dire il vero: $ @ e $ * non quotati sono gli stessi perché sono entrambi soggetti alla suddivisione delle parole. Citato, "$ @" preserva la suddivisione delle parole dei parametri posizionali, anche se un singolo parametro contiene un carattere in IFS.
Kojiro,

1
C'è un riferimento da quando viene utilizzato per le shell? Mi chiedo se Perl abbia preso quelli dagli script di shell.
simbabque,

Questo precede il Perl di decenni (o almeno anni). Gran parte della sintassi del Perl è stata influenzata dalla sintassi della shell. (Perl è nato nel 1987, e gran parte di questa sintassi proveniva dalla shell Bourne originale (1977). Non sono al 100% quando è stato introdotto $ _, ma era quasi certamente ben prima del 1987.
Popup,

6

$?è un parametro shell speciale (variabile).

In generale, tutte le variabili definite dall'utente devono essere nominate utilizzando solo i caratteri della classe di caratteri, [:alnum:]ovvero [a-zA-Z0-9_](anche non possono iniziare con [0-9]).

In breve, $?è una variabile speciale ( e ce ne sono alcune ) che può essere considerata come una caratteristica interna della shell stessa che fornisce il codice di uscita del comando precedente (sia riuscito che fallito).

Puoi leggere questo per avere più idea sulle variabili.


4

$?è una variabile speciale in bash che contiene sempre il codice di ritorno / uscita dell'ultimo comando eseguito.

È possibile visualizzarlo in un terminale eseguendo echo $?.

I codici di ritorno sono nell'intervallo [0; 255].
Un codice di ritorno di 0solito significa che tutto è ok.
Altri valori indicano errori. La maggior parte delle applicazioni restituisce 1valori personalizzati. Se non è stato trovato un comando, la variabile di solito contiene127

Se si desidera impostare questa variabile su un valore specifico, è possibile farlo facilmente con, bash -c "exit 5"ad esempio, per restituire il codice di ritorno 5.


Una funzione shell è un modo conforme a POSIX per impostare lo stato di uscita senza necessariamente biforcarsi. setstatus() { return 5; }
Kojiro,
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.