trap
ไม่ได้นำเสนอไปยัง subshells แต่บางวิธีอนุญาตให้ subshell รายงานกับดักของเชลล์พาเรนต์และอื่น ๆ ไม่ได้ ฉันทำการทดสอบบางอย่างกับ macos ด้วย bash
ทุบตี GNU รุ่น 4.4.12 (1) - ปล่อย (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 รุ่น 3.2.57 (1) - ปล่อย (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
เป็นการดีที่จะรู้ว่าtrap_output="$(trap)"
จะทำงานเพื่อดักจับเอาต์พุตของดัก ฉันไม่สามารถคิดวิธีอื่นถ้ามันไม่ทำงานนอกเหนือจากการทำtrap >trap_output_file
เพื่อส่งออกไปยังไฟล์ (Fifo จะไม่ทำงานbash 3.2.57
) แล้วอ่านกลับด้วยtrap_output="$(<trap_output_file)"
Fifo จะไม่ทำงานbash 3.2.57
เพราะว่างtrap &
เปล่าbash 3.2.57
แต่ไม่bash 4.4.12
ทุบตี GNU รุ่น 4.4.12 (1) - ปล่อย (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 รุ่น 3.2.57 (1) - ปล่อย (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