Saya mencoba skrip berikut:
#!/bin/bash
trap 'echo "touching a file" && touch $FILE' EXIT
foo1(){
echo "foo1"
}
foo(){
echo "foo"
export FILE=${FILE:-/tmp/file1}
}
(foo1)
foo
Output untuk skrip di atas adalah:
[root@usr1 my_tests]# ./test.sh
foo1
foo
touching a file
Namun saya mengharapkan jebakan untuk dipanggil keluar dari foo1
juga, yang disebut dalam subkulit.
- Apakah ini yang diharapkan?
- Apakah
trap
diwarisi oleh subkulit? - Jika ya, lalu dalam hal apa
trap
diwariskan oleh subkulit?
Jawaban:
Penangan perangkap tidak pernah diwarisi oleh subkulit. Ini ditentukan oleh POSIX :
Perhatikan bahwa sinyal yang diabaikan (
trap '' SIGFOO
) tetap diabaikan dalam subkulit (dan dalam program eksternal yang diluncurkan oleh shell juga).sumber
set -E
memiliki subshells mewarisi jebakan, tetapi benar-benar sulit untuk mendapatkan yang benar (setidaknya dalam pengalaman saya).trap
tidak dipropagasi ke subkulit tetapi beberapa cara memungkinkan subkulit untuk melaporkan perangkap dari shell induk dan yang lainnya tidak. Saya melakukan beberapa tes pada macos dengan bash.GNU bash, versi 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):
GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin16):
Ini bagus untuk diketahui yang
trap_output="$(trap)"
akan bekerja untuk menangkap keluaran perangkap. Saya tidak bisa memikirkan cara lain untuk melakukannya jika itu tidak berhasil selain melakukantrap >trap_output_file
untuk output ke file (fifo tidak akan berfungsibash 3.2.57
) dan kemudian membacanya kembali dengantrap_output="$(<trap_output_file)"
fifo tidak akan berfungsi
bash 3.2.57
karenatrap &
kosong untukbash 3.2.57
tetapi tidakbash 4.4.12
GNU bash, versi 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):
GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin16):
sumber
trap
definisi tidak disebarkan ke sub-shell.Verifikasi oleh:
trap "echo bla" 1 2 3"
(trap)
sumber
(trap)
sebagai case khusus, sehingga subshell dapat melaporkan (tetapi tidak benar-benar menggunakan) perangkap dari shell induk. Jadi tes itu tidak selalu dapat diandalkan.ksh88
,bosh
(schily Bourne Shell) danheirloom-sh
. Anda benar:ksh93
berperilaku berbeda.bash
tidak menghasilkan apa-apa jika Anda menelepon(trap)
.