Ya, nilai balik implisit dari suatu fungsi adalah status keluar dari perintah yang terakhir dieksekusi . Itu juga berlaku pada setiap titik dari skrip shell apa pun. Kapan pun dalam urutan eksekusi skrip, status keluar saat ini adalah status keluar dari perintah terakhir yang dijalankan. Bahkan perintah dieksekusi sebagai bagian dari tugas variabel: var=$(exit 34)
. Perbedaannya dengan fungsi adalah bahwa suatu fungsi dapat mengubah status keluar pada akhir pelaksanaan fungsi.
Cara alternatif untuk mengubah "status keluar sekarang" adalah memulai sub shell dan keluar dengan status keluar apa pun yang diperlukan:
$ $(exit 34)
$ echo "$?"
34
Dan ya, perluasan status keluar memang perlu dikutip:
$ IFS='123'
$ $(exit 34)
$ echo $?
4
A (exit 34)
juga bekerja.
Beberapa mungkin berpendapat bahwa konstruk yang lebih kuat seharusnya $(return 34)
, dan bahwa jalan keluar harus "keluar" dari skrip yang sedang dieksekusi. Tetapi $(return 34)
tidak berfungsi dengan versi bash apa pun . Jadi, ini tidak portabel.
Cara teraman untuk menetapkan status keluar adalah menggunakannya seperti yang dirancang untuk bekerja, menentukan, dan return
dari suatu fungsi:
exitstatus(){ return "${1:-"$?"}"; }
Jadi, di akhir fungsi. itu persis sama dengan tidak memiliki apa pun return
atau return "$?"
. Akhir dari suatu fungsi tidak perlu berarti "baris kode terakhir dari suatu fungsi".
#!/bin/sh
exitstatus(){ a="${1:-"$?"}"; return "$a"; }
gmx(){
if [ "$1" = "one" ]; then
printf 'foo ';
exitstatus 78
return "$?"
elif [ "$1" = "two" ]; then
printf 'baz ';
exitstatus 89
return
else
printf 'baz ';
exitstatus 90
fi
}
Akan dicetak:
$ ./script
foo 78
baz 89
baz 90
Satu-satunya penggunaan praktis "$?"
adalah untuk mencetak nilainya: echo "$?"
atau untuk menyimpannya dalam variabel (karena merupakan nilai sementara dan berubah dengan setiap perintah yang dijalankan): exitstatus=$?
(ingat untuk mengutip variabel dalam perintah seperti export EXITSTATUS="$?"
.
Dalam return
perintah, rentang nilai yang valid umumnya 0 hingga 255, tetapi pahami bahwa nilai-nilai 126 + n
digunakan oleh beberapa shell untuk memberi sinyal status keluar khusus, jadi, rekomendasi umum adalah menggunakan 0-125.
return
adalah untuk fungsi-fungsi yang didefinisikan sepertif() (...; cmd; return)
, ini mencegah optimasi yang dilakukan oleh beberapa shell dalam menjalankancmd
proses yang sama dengan subkulit. Dengan banyak shell, itu juga berarti bahwa status keluar dari fungsi tidak membawa informasi yangcmd
telah dimatikan ketika itu terjadi (kebanyakan shell tidak dapat mengambil informasi itu pula).