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):
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap | cat # trap -- 'echo hello' EXIT
(trap) | cat # trap -- 'echo hello' EXIT
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # trap -- 'echo hello' EXIT
GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin16):
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap > >(cat) # trap -- 'echo hello' EXIT
trap | cat # empty
(trap) | cat # empty
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # empty
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 melakukan trap >trap_output_file
untuk output ke file (fifo tidak akan berfungsi bash 3.2.57
) dan kemudian membacanya kembali dengantrap_output="$(<trap_output_file)"
fifo tidak akan berfungsi bash 3.2.57
karena trap &
kosong untuk bash 3.2.57
tetapi tidakbash 4.4.12
GNU bash, versi 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# trap -- 'echo hello' EXIT
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell
GNU bash, versi 3.2.57 (1) -release (x86_64-apple-darwin16):
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# empty because trap >/tmp/fifo & is empty since it uses trap &
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell