Pertimbangkan kode berikut
outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
inner-scope.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
Saya mencoba outer-scope.sh
keluar ketika ada panggilan inner()
gagal. Karena $()
memanggil sub-shell, ini tidak terjadi.
Bagaimana lagi cara saya mendapatkan output dari suatu fungsi sambil menjaga fakta bahwa fungsi tersebut dapat keluar dengan kode keluar yang tidak nol?
echo $()
, maka itu mungkin karena kode keluar subkulit diabaikan ketika baris -echo
perintah - memiliki kode keluar (biasanya 0) sendiri.if ! $(exit 1) ; then echo $?; fi
, saya mengerti0
. Tidak yakinif
cara untuk pergi jika Anda perlu mempertahankan nilai keluar itu.if ! output=$(inner); then exit $?; fi
akan keluar dengan kode kembali 0 karena$?
akan memberikan kode kembali!
bukan kode kembaliinner
. Anda bisa mendapatkan perilaku yang diinginkanif output=$(inner); then : ; else exit $?; fi
tetapi itu jelas lebih berteleLihat BashFAQ / 002 :
Kasus Khusus
Catatan tentang kasing rumit dengan variabel fungsi lokal, bandingkan kode berikut:
Kita akan mendapatkan:
Mengapa?
Ketika output dari sebuah subkulit digunakan untuk menginisialisasi
local
variabel, status keluar tidak lagi dari subkulit, tetapi dari perintah , yang paling mungkin .local
0
Lihat juga https://stackoverflow.com/a/4421282/537554
sumber
Dengan menambahkan
echo
, subkulit tidak berdiri sendiri (tidak dicentang secara terpisah) dan tidak dibatalkan. Tugas menghindari masalah ini.Anda juga dapat melakukan ini, dan mengarahkan output ke file, untuk memprosesnya nanti.
sumber