Apa itu `$?`? Apakah ini variabel?

23

Pertanyaannya cukup lurus ke depan. Saya bisa mendapatkan kode keluar dari perintah sebelumnya dengan menggunakan $?. Tapi apa sebenarnya itu?

Saya tidak berpikir itu adalah variabel, karena Anda tidak dapat memiliki karakter khusus atas nama variabel selain _.

foo?foo=10

akan menghasilkan kesalahan: foo?foo=10: command not found

Jadi jika itu bukan variabel, apa itu? Apakah ada orang lain yang menyukainya?

daltonfury42
sumber

Jawaban:

23

Apa itu?

$? adalah variabel bawaan yang menyimpan status keluar dari perintah, fungsi, atau skrip itu sendiri.

$?membaca status keluar dari perintah terakhir yang dijalankan. Setelah fungsi kembali, $?berikan status keluar dari perintah terakhir yang dijalankan dalam fungsi. Ini adalah cara Bash untuk memberi fungsi "nilai pengembalian." Itu kembali 0pada keberhasilan atau bilangan bulat dalam rentang 1 - 255kesalahan.

Apakah ada orang lain yang menyukainya?

Ya, ada beberapa variabel bawaan seperti itu di bash. Anda dapat melihat daftar di sini . Refer: http://www.tldp.org/LDP/abs/html/exit-status.html

Ron
sumber
1
Jadi hanya tersedia di bash shell saja?
daltonfury42
4
@ daltonfury42 tidak, setiap shell bahwa usaha untuk memiliki beberapa kompatibilitas dengan Bourne shell akan mendukungnya (termasuk dash, ksh, zsh, antara lain).
muru
2
csh dan ikan gunakan $statusuntuk tujuan yang sama
glenn jackman
22

$?adalah variabel tetapi khusus, itu sebabnya karakter khusus diperbolehkan. ($?)Perluas ke status keluar dari pipa depan yang baru saja dieksekusi.

Bukan satu-satunya, shell memperlakukan beberapa parameter khusus. Parameter ini hanya dapat dirujuk; penugasan kepada mereka tidak diizinkan:

Variable    Meaning
$0          Filename of script
$1          Positional parameter #1
$2 - $9     Positional parameters #2 - #9
${10}       Positional parameter #10
$#          Number of positional parameters
"$*"        All the positional parameters (as a single word) *
"$@"        All the positional parameters (as separate strings)
${#*}       Number of positional parameters
${#@}       Number of positional parameters
$?          Return value
$$          Process ID (PID) of script
$-          Flags passed to script (using set)
$_          Last argument of previous command
$!          Process ID (PID) of last job run in background

* Must be quoted, otherwise it defaults to $@.

Sumber:

Sylvain Pineau
sumber
2
"$*"bukan hanya semua parameter posisi sebagai kata tunggal, tetapi semua parameter posisi dipisahkan oleh karakter pertama IFSsebagai kata tunggal. Karena hasilnya akan mengalami pemisahan bidang jika tidak dikutip, efeknya adalah seolah-olah $@digunakan dalam kasus yang tidak dikutip .
muru
1
Yang pasti: tanda kutip $ @ dan $ * sama karena keduanya tunduk pada pemisahan kata. Dikutip, "$ @" mempertahankan pemisahan kata dari parameter posisi, bahkan jika parameter individu berisi karakter dalam IFS.
kojiro
1
Apakah ada referensi sejak kapan itu digunakan untuk kerang? Saya ingin tahu apakah Perl mengambilnya dari shell scripting.
simbabque
Ini mendahului Perl oleh dekade (atau setidaknya tahun). Banyak sintaks Perl dipengaruhi oleh sintaksis shell. (Perl lahir pada tahun 1987, dan banyak sintaksis ini berasal dari shell Bourne asli (1977). Saya tidak 100% ketika $ _ diperkenalkan, tetapi hampir pasti baik sebelum 1987.
Popup
6

$?adalah parameter shell khusus (variabel).

Secara umum semua variabel yang ditentukan pengguna harus dinamai dengan hanya menggunakan karakter dari kelas karakter [:alnum:]yaitu [a-zA-Z0-9_](juga tidak dapat mulai dengan [0-9]).

Singkatnya, $?adalah variabel khusus ( dan ada beberapa di antaranya ) yang dapat dianggap sebagai fitur internal dari shell itu sendiri yang menyediakan kode keluar dari perintah sebelumnya (apakah berhasil atau gagal).

Anda dapat membaca ini untuk mendapatkan lebih banyak gagasan tentang variabel.

heemayl
sumber
4

$?adalah variabel khusus dalam bash yang selalu memegang kode kembali / keluar dari perintah yang terakhir dieksekusi.

Anda dapat melihatnya di terminal dengan menjalankan echo $?.

Kode pengembalian berada dalam kisaran [0; 255].
Kode pengembalian 0biasanya berarti semuanya baik-baik saja.
Nilai-nilai lain menunjukkan kesalahan. Sebagian besar aplikasi mengembalikan 1nilai-nilai khusus. Jika suatu perintah tidak ditemukan, variabel biasanya berisi127

Jika Anda ingin mengatur variabel ini ke nilai tertentu, Anda dapat dengan mudah melakukan ini dengan bash -c "exit 5"kembali misalnya kode kembali 5.

Komandan Byte
sumber
Fungsi shell adalah cara yang sesuai dengan POSIX untuk mengatur status keluar tanpa perlu forking. setstatus() { return 5; }
kojiro