Apa perbedaan antara pernyataan return
dan exit
dalam fungsi Bash sehubungan dengan kode keluar?
Apa perbedaan antara pernyataan return
dan exit
dalam fungsi Bash sehubungan dengan kode keluar?
Jawaban:
Dari man bash
pada return [n]
;
Menyebabkan fungsi berhenti mengeksekusi dan mengembalikan nilai yang ditentukan oleh n ke pemanggilnya. Jika n dihilangkan, status kembali adalah bahwa dari perintah terakhir yang dijalankan di badan fungsi.
... pada exit [n]
:
Menyebabkan shell keluar dengan status n. Jika n dihilangkan, status keluar adalah dari perintah terakhir yang dijalankan. Jebakan pada EXIT dieksekusi sebelum shell berakhir.
EDIT:
Sesuai dengan pengeditan pertanyaan Anda, mengenai kode keluar, return
tidak ada hubungannya dengan kode keluar. Kode keluar dimaksudkan untuk aplikasi / skrip , bukan fungsi. Jadi dalam hal ini, satu-satunya kata kunci yang menetapkan kode keluar dari skrip (salah satu yang dapat ditangkap oleh program panggilan menggunakan $?
variabel shell) adalah exit
.
EDIT 2:
Mengacu pernyataan terakhir saya exit
menyebabkan beberapa komentar. Itu dibuat untuk membedakan return
dan exit
untuk memahami OP, dan pada kenyataannya, pada setiap titik tertentu dari program / script shell, exit
satu-satunya cara mengakhiri script dengan kode keluar untuk proses menelepon.
Setiap perintah yang dijalankan di shell menghasilkan "kode keluar" lokal: ia menetapkan $?
variabel ke kode itu, dan dapat digunakan bersama if
, &&
dan operator lain untuk menjalankan perintah lain secara kondisional.
Kode keluar ini (dan nilai $?
variabel) diatur ulang oleh setiap eksekusi perintah.
Kebetulan, kode keluar dari perintah terakhir yang dijalankan oleh skrip digunakan sebagai kode keluar dari skrip itu sendiri seperti yang terlihat oleh proses pemanggilan.
Akhirnya, fungsi, ketika dipanggil, bertindak sebagai perintah shell sehubungan dengan keluar dari kode. Kode keluar dari fungsi ( dalam fungsi) diatur dengan menggunakan return
. Jadi ketika dalam suatu fungsi return 0
dijalankan, eksekusi fungsi berakhir, memberikan kode keluar 0.
func(){ return 50; };func;echo $?
menggemakan 50. Jadi $?
variabel shell tampaknya tidak terbatas exit
.
$?
Perluas ke status keluar dari pipa depan yang baru saja dieksekusi." Keluar itu mungkin dari shell dalam bentuk panggilan ke exit
(atau memukul akhir skrip) atau dalam bentuk panggilan ke return
dalam suatu fungsi.
$?
proses / skrip saat ini terbatas pada exit
atau pada hasil dari perintah terakhir yang dijalankan oleh skrip ini. Jadi, jika baris skrip terakhir Anda adalah panggilan ke fungsi itu, dan fungsi itu mengembalikan 50, ya, $?
yang Anda hasilkan untuk proses yang memanggil Anda adalah 50. Namun, itu tidak ada hubungannya dengan return
, karena ini adalah terbatas pada skrip saat ini. Kebetulan dikembalikan hanya jika pemanggilan fungsi ini adalah kalimat terakhir dari skrip. exit
Namun, selalu selesaikan skrip dan kembalikan nilai itu $?
ke proses pemanggilan .
return
tidak ada hubungannya dengan kode keluar." Eksperimen memberi tahu saya bahwa tidak ada perbedaan fungsional antara kode kembali fungsi dan kode keluar skrip.
return
akan menyebabkan fungsi saat ini keluar dari ruang lingkup, sementara exit
akan menyebabkan skrip berakhir pada titik di mana ia dipanggil. Berikut adalah contoh program untuk membantu menjelaskan ini:
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
$?
.
echo fnord | while read x; do exitfunc; done; echo "still here"
akan mencetak "masih di sini". Tampaknya hanya while
sub-shell yang keluar dalam skenario ini.
done || exit $?
tetapi itu jelek dan tidak persis setara.
return
akan menyebabkan fungsi atau skrip bersumber saat ini keluar dari ruang lingkup```.
Saya tidak berpikir ada orang yang benar-benar menjawab pertanyaan karena mereka tidak menjelaskan bagaimana keduanya digunakan. OK saya pikir kita tahu bahwa exit membunuh skrip, di mana pun skrip dipanggil dan Anda dapat menetapkan statusnya juga seperti keluar atau keluar 0 atau keluar 7 dan seterusnya. Ini dapat digunakan untuk menentukan bagaimana skrip dipaksa berhenti jika dipanggil oleh skrip lain dll. Cukup saat keluar.
kembali ketika dipanggil akan mengembalikan nilai yang ditentukan untuk menunjukkan perilaku fungsi, biasanya 1 atau 0. Sebagai contoh:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
periksa seperti ini:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
atau seperti ini:
isdirectory || echo "not a directory"
Dalam contoh ini, tes dapat digunakan untuk menunjukkan apakah direktori itu ditemukan. perhatikan bahwa apa pun setelah pengembalian tidak akan dieksekusi dalam fungsi. 0 benar tetapi salah 1 dalam shell, berbeda dari prog langs lainnya.
Untuk info lebih lanjut tentang fungsi: http://www.linuxjournal.com/content/return-values-bash-functions
CATATAN: Fungsi direktori adalah hanya untuk keperluan pengajaran. Seharusnya ini bukan cara Anda melakukan opsi seperti itu dalam skrip nyata.
test -d $1
untuk mencapai hasil yang sama. Tidak pernah melakukannya if <check> return else return
. <check>
sendirian akan melakukan hal yang sama dalam semua bahasa yang saya tahu setidaknya.
isdirectory() { [ -d "$1" ]; }
akan berperilaku persis sama dengan apa yang Anda miliki di sini: Nilai pengembalian default dari fungsi shell, apakah dengan mencapai akhir kode atau return
dengan tanpa argumen, adalah dari perintah terbaru.
return
pernyataan itu. Memang benar bahwa contohnya sederhana dan tidak digunakan dalam produksi. Tapi itu sederhana, jadi itu menyelesaikan tugasnya dengan baik. Tidak ada yang salah dengan itu.
Ingat, fungsi internal ke skrip dan biasanya kembali dari mana mereka dipanggil dengan menggunakan pernyataan kembali. Memanggil skrip eksternal adalah masalah lain sepenuhnya, dan skrip biasanya berakhir dengan pernyataan keluar.
Perbedaan "antara pernyataan kembali dan keluar dalam fungsi BASH sehubungan dengan kode keluar" sangat sedikit. Keduanya mengembalikan status, bukan nilai per se. Status nol menunjukkan keberhasilan, sementara status lainnya (1 hingga 255) menunjukkan kegagalan. Pernyataan pengembalian akan kembali ke skrip dari mana ia dipanggil, sedangkan pernyataan keluar akan mengakhiri seluruh skrip dari mana pun itu ditemui.
return 0 # returns to where the function was called. $? contains 0 (success).
return 1 # returns to where the function was called. $? contains 1 (failure).
exit 0 # exits the script completely. $? contains 0 (success).
exit 1 # exits the script completely. $? contains 1 (failure).
Jika fungsi Anda berakhir tanpa pernyataan pengembalian, status perintah terakhir yang dijalankan dikembalikan sebagai kode status (dan akan ditempatkan di $?
).
Ingat, kembali dan keluar, berikan kembali kode status dari 0 hingga 255, tersedia di $?
. Anda tidak dapat memasukkan hal lain ke dalam kode status (mis. Mengembalikan "cat"); itu tidak akan bekerja. Tetapi, sebuah skrip dapat mengembalikan 255 alasan berbeda untuk kegagalan dengan menggunakan kode status.
Anda dapat mengatur variabel yang terkandung dalam skrip panggilan, atau hasil gema dalam fungsi dan menggunakan substitusi perintah dalam skrip panggilan; tetapi tujuan kembali dan keluar adalah untuk lulus kode status, bukan nilai atau hasil perhitungan seperti yang mungkin diharapkan dalam bahasa pemrograman seperti C.
Terkadang, Anda menjalankan skrip menggunakan .
atau source
.
. a.sh
Jika Anda memasukkan exit
dalam a.sh
, itu tidak hanya akan menghentikan skrip, tetapi mengakhiri sesi shell Anda.
Jika Anda memasukkan return
dalam a.sh
, itu hanya berhenti memproses skrip.
return: can only 'return' from a function or sourced script
, yang membuatnya tidak cocok untuk skrip umum.
all
situasi. Menggunakan .
atau source
menjalankan skrip di shell saat ini, alih-alih menghasilkan sub-shell. Script harus tahu bagaimana cara menggunakannya. Celakalah pengguna yang melakukannya secara berlawanan. Secara pribadi, saya sarankan membaca skrip sebelum menjalankannya pertama kali.
trap
fungsi untuk ERR EXIT
dan kemudian pertama-tama menyimpan kode keluar dari perintah yang gagal errCode=$?
dan kemudian keluar dari skrip (bersumber atau tidak) dengan return $errCode || exit $errCode
mana ||
artinya "jika saya tidak dapat kembali karena saya tidak bersumber , keluar saja sebagai gantinya ".
Dengan kata-kata sederhana (terutama untuk pemula dalam pengkodean), kita dapat mengatakan,
`return` : exits the function,
`exit()` : exits the program(called as process while running)
Juga Jika Anda mengamati, ini sangat mendasar tapi ...,
`return` : is the keyword
`exit()` : is the function
exit
tidak lebih dari fungsi return
. Mereka adalah perintah bawaan. Mereka bahkan bukan kata-kata yang dicadangkan.
exit
menghentikan proses saat ini ; dengan atau tanpa kode keluar, anggap ini sistem lebih dari sekadar fungsi program. Perhatikan bahwa saat sumber, exit
akan mengakhiri shell, namun, saat menjalankan hanya akan exit
skrip.
return
dari fungsi, kembali ke instruksi setelah panggilan, dengan atau tanpa kode kembali. return
bersifat opsional dan tersirat di akhir fungsi. return
hanya dapat digunakan di dalam suatu fungsi.
Saya ingin menambahkan bahwa saat bersumber, tidak mudah untuk exit
skrip dari dalam suatu fungsi tanpa membunuh shell. Saya pikir, contoh lebih baik pada skrip 'tes'
#!/bin/bash
function die(){
echo ${1:=Something terrible wrong happen}
#... clean your trash
exit 1
}
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
lakukan hal berikut:
user$ ./test
Whatever is not available
user$
test
-dan- cangkangnya akan menutup.
user$ . ./test
Whatever is not available
hanya test
akan selesai dan prompt akan ditampilkan.
Solusinya adalah dengan melampirkan prosedur potensial di (
dan)
#!/bin/bash
function die(){
echo $(1:=Something terrible wrong happen)
#... clean your trash
exit 1
}
( # added
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
) # added
sekarang, dalam kedua kasus hanya test
akan keluar.
(
dan )
meletakkan blok itu di sub-shell, secara efektif membatalkan perintah .
(sumber) seolah-olah Anda telah menjalankan skrip tes secara normal, yang berada di dalam sub-shell. Jika script tidak berjalan dengan .
atau source
Anda secara efektif memiliki 2 sub-shell.
Pertanyaan OP: Apa perbedaan antara pernyataan kembali dan keluar dalam fungsi BASH sehubungan dengan kode keluar?
Tiga puluh, beberapa klarifikasi diperlukan:
Dalam daftar bullet di atas, pilih dari "(x | y)" selalu item pertama atau selalu item kedua untuk mendapatkan pernyataan tentang fungsi & kembali atau masing-masing shell & keluar.
Yang jelas keduanya sama-sama menggunakan variabel khusus $ $? untuk meneruskan nilai ke atas setelah berakhir.
* Sekarang untuk cara khusus yang $? dapat diatur:
Perlu dicatat bahwa $? dapat diberi nilai dengan memanggil exit di sub shell, seperti ini:
# (exit 259)
# echo $?
3
exit 259
gema 3
karena nilai keluar akhir adalah satu byte. 259 % 256 = 3
Pertama-tama, return
adalah kata kunci dan exit
teman saya adalah fungsi.
Yang mengatakan, inilah penjelasan paling sederhana.
return
Ini mengembalikan nilai dari suatu fungsi.
exit
Itu keluar dari atau meninggalkan shell saat ini.
return
kata kunci. Pengembalian lebih dari sekedar kode keluar yang mengapa perbandingannya tidak adil.
exit
tidak return
ada "kata kunci", atau, sebagaimana manual bash menyebutnya, "kata-kata yang dicadangkan". Tidak ada yang merupakan "fungsi" baik, dalam arti fungsi bash. Keduanya adalah perintah builtin, dalam istilah bash. (Ada adalah fungsi standar C library disebut exit()
, dan bahasa pemrograman C memiliki kata reserved return
, tetapi mereka tidak harus bingung dengan perintah bash, meskipun semantik mereka ingin tahu serupa.)
help <command>
shell Anda untuk mendapatkan info tentang apa yang akan dilakukan oleh shell builtin. Dalam kasus Andahelp return
danhelp exit