Apa arti dari $? dalam skrip shell?

Jawaban:

43

$?memperluas ke status keluar dari pipa foreground yang paling baru dieksekusi. Lihat bagian Parameter Khusus dari manual Bash .

Dalam istilah yang lebih sederhana, ini adalah status keluar dari perintah terakhir.

cjm
sumber
26

Jawaban Cjm benar, tetapi $?dapat digunakan dengan cara konyol dalam skrip shell, dan saya ingin memperingatkan hal itu. Banyak skrip shell yang buruk memiliki pola kode yang berulang:

run_some_command
EXIT_STATUS=$?

if [ "$EXIT_STATUS" -eq "0" ]
then
    # Do work when command exists on success
else
    # Do work for when command has a failure exit
fi

Jika mungkin (masalah keterbacaan terkadang mengganggu) Anda harus mengkode situasi ini secara berbeda:

if run_some_command
then
    # Do work when command exists on success
else
    # Do failure exit work
fi

Penggunaan terakhir ini lebih cepat, tidak mencemari namespace variabel shell dengan jumlah apa untuk variabel temp, sering dapat jauh lebih mudah dibaca untuk manusia dan mendorong penggunaan "logika positif", praktik penulisan conditional tanpa negasi, yang memiliki kognitif kesederhanaan dalam kebanyakan situasi. Itu tidak menggunakan $?sebagian besar.

Bruce Ediger
sumber
5
Sintaks yang lebih rumit diperlukan ketika ada lebih banyak kemungkinan daripada hanya 0 atau 1 - program sering mengkomunikasikan informasi yang berguna melalui kode keluar. Dan itu juga berguna jika Anda perlu menggunakan kembali nilai itu nanti dalam kode (untuk logging, misalnya).
mattdm
3

Selain apa yang dikatakan cjm , jika nilai $?0, maka proses sebelumnya tidak berakhir secara normal (atau berhasil). Kalau tidak, ada beberapa kesalahan.

Barun
sumber
8
Itu tidak selalu menandakan kesalahan. diffkeluar dengan 0 jika file yang dibandingkan adalah sama, dengan 1 jika mereka berbeda, dan 2 adalah kesalahan.
Shawn J. Goff
2
Itu tidak pernah menandakan kesalahan. Ini hanya status keluar dari perintah sebelumnya. Masalah "0 jika keluar normal" adalah konvensi (EXIT_SUCCESS / EXIT_FAILURE)
aviraldg
3

$?-Status keluar dari perintah terakhir dieksekusi.

$0-Nama file dari skrip saat ini.

$#-Jumlah argumen yang disediakan untuk skrip.

$$-Nomor proses dari shell saat ini. Untuk skrip shell, ini adalah proses ID di mana mereka mengeksekusi.

Midhun S Sivan
sumber
0

$? berikan kami status eksekusi dari perintah eksekusi terakhir saat diminta. Nilai '0' menunjukkan bahwa perintah dieksekusi berhasil dan '1' adalah untuk tidak berhasil.

Rahul Arora
sumber
2
Tidak hanya pada petunjuk interaktif, tetapi juga dalam skrip, dan nilai bukan nol menandakan kegagalan.
Kusalananda
-3

$?menentukan status keluar dari perintah yang dieksekusi. $diikuti dengan angka (misalnya $1, $2, dll) merupakan parameter dalam shell script.

harika
sumber
Anda mungkin ingin membaca jawaban yang benar ...
jasonwryan