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?


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 ).


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.