Apakah "$?" variabel (tanda tanya dolar) hanya tersedia di Bash shell?

10

Dalam Bashshell, saya bisa mendapatkan status perintah keluar melalui $?variabel:

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

Apakah hanya tersedia di Bash shell? Atau bisakah saya juga menggunakannya di kulit lain?

Nan Xiao
sumber
8
Anda dapat menggunakannya di setiap shell POSIX, ini adalah salah satu parameter khusus
cuonglm

Jawaban:

19

Kode $?keluar adalah umum untuk setiap shell yang mengikuti POSIX, dan dijelaskan dalam 2.5.2 Parameter Khusus :

?
Perluas ke status keluar desimal dari pipa terbaru (lihat Pipa ).

Thomas Dickey
sumber
5
Tidak hanya cangkang POSIX, semua cangkang mirip Bourne termasuk cangkang Bourne (yang saya percaya adalah yang memperkenalkannya, cangkang Mashey memilikinya seperti yang $rsaya yakini). Jadi itulah sh dari hampir semua sistem mirip Unix sejak Unix V7 di akhir 70-an, Sebagian besar kerang lainnya (csh, tcsh, fish, rc) memilikinya $status.
Stéphane Chazelas
2
Dan banyak bahasa skrip: Perl, Ruby, dll.
OrangeDog
13

Seperti yang dikatakan Thomas Dickey, semua shell POSIX (mis., Hampir semuanya) akan memilikinya $?.

Pertanyaan ini cukup menarik bagi saya, jadi saya mengujinya pada shell apa pun yang bisa saya dapatkan:

  • mksh
  • zsh
  • /bin/sh pada Samsung Galaxy S5 saya
  • /bin/sh di router saya
  • tcsh
  • ksh
  • dash
  • /bin/sh pada Sistem V UNIX virtual saya dari tahun 1989 atau lebih
  • cmd.exedan powershell.exedi komputer Windows 10 saya

dan $?bekerja di semua ini tetapi fishdan cmd.exe.

Ditemukan dua hal menarik:

1. $?berfungsi di Windows PowerShell!

Ya, to the point. Alih-alih mengembalikan 0 atau angka yang lebih tinggi, itu hanya Truedan 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. $?tidak bekerja di shell fish.

Namun, saat Anda mengetikkan $?ikan, Anda mendapatkan pesan ini:

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

Saya belum sering menggunakannya tetapi saya tidak terkejut, fishsepertinya memiliki bahasa shell yang menarik, sangat berbeda dari bashatau apa pun.

anak aprikot
sumber
Kebanyakan cangkang (ikan, csh, tcsh, rc, zsh) menggunakan $statusIMO yang jauh lebih mudah / terbaca. Hanya cangkang mirip Bourne (di antara cangkang Unix) yang menggunakan $?AFAIK.
Stéphane Chazelas
3
Tergantung bagaimana Anda membaca. Saya membaca secara mental $?ketika "sh ## terjadi?" dan setelah itu, saya tidak pernah lupa arti dari variabel khusus ini :)
2
@nwildner lol! Saya pikir saya tidak akan pernah melupakan itu sekarang!
hanetzer