Apa tidak
echo $?
maksud dalam pemrograman shell?
shell
scripting
special-characters
Harshay Buradkar
sumber
sumber
Jawaban:
Ini adalah status keluar dari perintah yang dieksekusi terakhir.
Misalnya perintah
true
selalu mengembalikan status0
danfalse
selalu mengembalikan status1
:Dari manual: (dapat diakses dengan memanggil
man bash
shell Anda)Dengan konvensi status keluar
0
berarti berhasil, dan status pengembalian tidak nol berarti kegagalan. Pelajari lebih lanjut tentang status keluar di wikipedia .Ada variabel khusus lain seperti ini, seperti yang dapat Anda lihat di manual online ini: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
sumber
$
dan?
dua parameter berbeda dan$?
tidak muncul di halaman bash (1).$?
mengembalikan nilai keluar dari perintah yang terakhir dieksekusi.echo $?
mencetak nilai itu di konsol. nol menyiratkan eksekusi yang berhasil sementara nilai-nilai yang tidak nol dipetakan ke berbagai alasan kegagalan.Karena itu ketika scripting; Saya cenderung menggunakan sintaks berikut
Perbandingannya harus dilakukan pada sama dengan
0
atau tidak sama0
.** Pembaruan Berdasarkan komentar: Idealnya, Anda tidak boleh menggunakan blok kode di atas untuk perbandingan, lihat komentar @tripleee dan penjelasannya.
sumber
cmd; if [ $? -eq 0 ]; then
harus di refactoredif cmd; then
. Sangat Tujuan dariif
(dan laporan kontrol aliran lainnya di shell) adalah dengan menjalankan perintah dan memeriksa status keluar nya.if cmd;
mungkin tidak terlalu mudah dibaca adalah beberapa kondisi terutama ketika cmd merujuk ke skrip lain.[ 1 ]
dan[ 0 ]
keduanya benar;[
tanpa operator memeriksa apakah argumennya adalah string yang tidak kosong.vendor/bin/drush status bootstrap | grep -q $(vendor/bin/drush php-eval 'if (function_exists("t")) echo t("Successful");') &> /dev/null;
. Jika saya harus meletakkannya dalam satu baris,if [ ... ]
itu akan sangat tidak dapat dibaca. Saya berencana untuk menyimpan output dari baris itu ke variabel jadi saya bisa katakanif [ $drupal_installed -eq 0 ]
nanti.echo $? - Memberikan STATUS KELUAR dari perintah yang paling baru dieksekusi . STATUS KELUAR ini kemungkinan besar adalah angka dengan NOL yang menyiratkan Kesuksesan dan nilai NON-ZERO yang mengindikasikan Kegagalan
? - Ini adalah salah satu parameter / variabel khusus dalam bash.
$? - Ini memberi nilai yang disimpan dalam variabel "?".
Beberapa parameter khusus serupa di BASH adalah 1,2, *, # (Biasanya terlihat dalam perintah gema sebagai $ 1, $ 2, $ *, $ #, dll,).
sumber
Ini memiliki kode status terakhir (nilai keluar) dari suatu perintah.
sumber
Contoh status keluar POSIX C minimal
Untuk memahami
$?
, Anda harus terlebih dahulu memahami konsep status proses keluar yang ditentukan oleh POSIX . Di Linux:ketika suatu proses memanggil panggilan
exit
sistem, kernel menyimpan nilai yang diteruskan ke panggilan sistem (anint
) bahkan setelah proses mati.Sistem exit panggilan disebut dengan
exit()
fungsi ANSI C, dan secara tidak langsung ketika Anda melakukanreturn
darimain
.proses yang disebut proses anak keluar (Bash), sering dengan
fork
+exec
, dapat mengambil status keluar anak denganwait
panggilan sistemPertimbangkan kode Bash:
C "setara" adalah:
false.c
bash.c
Kompilasi dan jalankan:
Keluaran:
Di Bash, ketika Anda menekan enter, fork + exec + wait terjadi seperti di atas, dan bash kemudian set
$?
ke status keluar dari proses bercabang.Catatan: untuk perintah bawaan seperti
echo
, suatu proses tidak perlu muncul, dan Bash hanya menetapkan$?
ke 0 untuk mensimulasikan proses eksternal.Standar dan dokumentasi
POSIX 7 2.5.2 "Parameter Khusus" http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_02 :
man bash
"Parameter Khusus":ANSI C dan POSIX kemudian merekomendasikan bahwa:
0
berarti programnya berhasilnilai-nilai lain: program gagal entah bagaimana.
Nilai yang tepat dapat menunjukkan jenis kegagalan.
ANSI C tidak mendefinisikan arti dari sembarang vaues, dan POSIX menentukan nilai yang lebih besar dari 125: Apa arti dari "POSIX"?
Bash menggunakan status keluar untuk
if
Di Bash, kami sering menggunakan status keluar
$?
secara implisit untuk mengontrolif
pernyataan seperti pada:di mana
true
program yang baru saja mengembalikan 0.Di atas setara dengan:
Dan masuk:
[
hanyalah sebuah program dengan nama aneh (dan Bash built-in yang berperilaku seperti itu), dan1 = 1 ]
argumennya, lihat juga: Perbedaan antara tanda kurung kotak tunggal dan ganda di Bashsumber
Dari http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
sumber
Lihat Manual Bash di bawah 3.4.2 Parameter Khusus :
Agak sulit ditemukan karena tidak terdaftar sebagai
$?
(nama variabel "hanya"?
). Juga lihat bagian status keluar , tentu saja ;-)Selamat coding.
sumber
Output hasil dari perintah unix yang terakhir dieksekusi
sumber