Apa tidak
echo $?
maksud dalam pemrograman shell?
Apa tidak
echo $?
maksud dalam pemrograman shell?
Jawaban:
Ini adalah status keluar dari perintah yang dieksekusi terakhir.
Misalnya perintah true
selalu mengembalikan status 0
dan false
selalu mengembalikan status 1
:
true
echo $? # echoes 0
false
echo $? # echoes 1
Dari manual: (dapat diakses dengan memanggil man bash
shell Anda)
$?
Memperluas status keluar dari pipa latar depan yang baru saja dieksekusi.
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
$
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
if [ $? -eq 0 ]; then
# do something
else
# do something else
fi
Perbandingannya harus dilakukan pada sama dengan 0
atau tidak sama 0
.
** Pembaruan Berdasarkan komentar: Idealnya, Anda tidak boleh menggunakan blok kode di atas untuk perbandingan, lihat komentar @tripleee dan penjelasannya.
cmd; if [ $? -eq 0 ]; then
harus di refactored if cmd; then
. Sangat Tujuan dari if
(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 katakan if [ $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,).
Ini memiliki kode status terakhir (nilai keluar) dari suatu perintah.
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 (an int
) bahkan setelah proses mati.
Sistem exit panggilan disebut dengan exit()
fungsi ANSI C, dan secara tidak langsung ketika Anda melakukan return
dari main
.
proses yang disebut proses anak keluar (Bash), sering dengan fork
+ exec
, dapat mengambil status keluar anak dengan wait
panggilan sistem
Pertimbangkan kode Bash:
$ false
$ echo $?
1
C "setara" adalah:
false.c
#include <stdlib.h> /* exit */
int main(void) {
exit(1);
}
bash.c
#include <unistd.h> /* execl */
#include <stdlib.h> /* fork */
#include <sys/wait.h> /* wait, WEXITSTATUS */
#include <stdio.h> /* printf */
int main(void) {
if (fork() == 0) {
/* Call false. */
execl("./false", "./false", (char *)NULL);
}
int status;
/* Wait for a child to finish. */
wait(&status);
/* Status encodes multiple fields,
* we need WEXITSTATUS to get the exit status:
* http://stackoverflow.com/questions/3659616/returning-exit-code-from-child
**/
printf("$? = %d\n", WEXITSTATUS(status));
}
Kompilasi dan jalankan:
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o bash bash.c
g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o false false.c
./bash
Keluaran:
$? = 1
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 :
? Perluas ke status keluar desimal dari saluran pipa terbaru (lihat Saluran Pipa).
man bash
"Parameter Khusus":
Shell memperlakukan beberapa parameter secara khusus. Parameter ini hanya dapat dirujuk; penugasan kepada mereka tidak diizinkan. [...]
? Memperluas status keluar dari pipa latar depan yang baru saja dieksekusi.
ANSI C dan POSIX kemudian merekomendasikan bahwa:
0
berarti programnya berhasil
nilai-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 mengontrol if
pernyataan seperti pada:
if true; then
:
fi
di mana true
program yang baru saja mengembalikan 0.
Di atas setara dengan:
true
result=$?
if [ $result = 0 ]; then
:
fi
Dan masuk:
if [ 1 = 1 ]; then
:
fi
[
hanyalah sebuah program dengan nama aneh (dan Bash built-in yang berperilaku seperti itu), dan 1 = 1 ]
argumennya, lihat juga: Perbedaan antara tanda kurung kotak tunggal dan ganda di Bash
Dari http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
?
Expands to the exit status of the most recently executed foreground pipeline.
Lihat Manual Bash di bawah 3.4.2 Parameter Khusus :
? - Perluas ke status keluar dari pipa foreground yang baru saja dieksekusi.
Agak sulit ditemukan karena tidak terdaftar sebagai $?
(nama variabel "hanya" ?
). Juga lihat bagian status keluar , tentu saja ;-)
Selamat coding.