Il "$?" (punto interrogativo in dollari) variabile disponibile solo nella shell Bash?


10

Nella Bashshell, posso ottenere il comando exit status tramite la $?variabile:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0

È disponibile solo nella shell Bash? O posso usarlo anche in altre shell?


8
Puoi usarlo in qualsiasi shell POSIX, è uno dei parametri speciali
cuonglm

Risposte:


19

Il $?codice di uscita è comune a qualsiasi shell che segue POSIX ed è descritto in 2.5.2 Parametri speciali :

?
Si espande allo stato di uscita decimale della pipeline più recente (consultare Pipeline ).


5
Non solo shell POSIX, tutte le shell tipo Bourne inclusa la shell Bourne (che credo fosse quella che la introduceva, la shell Mashey ce l'aveva come $rcredo). Quindi questo è lo sh di praticamente tutti i sistemi simili a Unix dalla Unix V7 alla fine degli anni '70, la maggior parte degli altri shell (csh, tcsh, fish, rc) ce l'hanno $status.
Stéphane Chazelas,

2
E molti linguaggi di scripting: Perl, Ruby, ecc.
OrangeDog,

13

Come diceva Thomas Dickey, qualsiasi shell POSIX (cioè praticamente tutte) avrà $?.

Questa domanda mi ha interessato un po ', quindi l'ho testata su qualsiasi shell su cui potessi mettere le mani:

  • mksh
  • zsh
  • /bin/sh sul mio Samsung Galaxy S5
  • /bin/sh sul mio router
  • tcsh
  • ksh
  • dash
  • /bin/sh sul mio sistema UNIX virtuale V dal 1989 in poi
  • cmd.exee powershell.exesul mio computer Windows 10

e ha $?lavorato in tutti questi ma fishe cmd.exe.

Ho trovato due cose interessanti:

1. $?funziona in Windows PowerShell!

Bene, fino a un certo punto. Invece di restituire 0 o un numero più alto, è giusto Truee False.

PS C:\WINDOWS\system32> echo $?
True
PS C:\WINDOWS\system32> gfdhgfhfdgfdg
gfdhgfhfdgfdg : The term 'gfdhgfhfdgfdg' is not recognized as the name of a cmdlet, ...(big long error output).....
PS C:\WINDOWS\system32> echo $?
False

2. $?non funziona nella shell fish.

Tuttavia, quando si digita il $?pesce, viene visualizzato questo messaggio:

~$ echo $?
$? is not the exit status. In fish, please use $status.
fish: echo $?

Non l'ho usato molto ma non mi sorprende, fishsembra che abbia un suo linguaggio di shell interessante, completamente diverso basho qualunque cosa.


La maggior parte delle conchiglie (pesce, csh, tcsh, rc, zsh) usa $statusun IMO molto più semplice / leggibile. Solo le shell tipo Bourne (tra le shell Unix) usano $?AFAIK.
Stéphane Chazelas,

3
Dipende solo da come stai leggendo. Ho letto mentalmente $?come "sh ## successo?" e dopo, non ho mai dimenticato il significato di questa variabile speciale :)

2
@nwildner lol! Penso che non lo dimenticherò mai adesso!
appendiabiti
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.