trap
wird nicht auf Subshells übertragen, aber einige Methoden ermöglichen es der Subshell, die Überfüllungen der übergeordneten Shell zu melden, andere nicht. Ich habe einige Tests auf Macos mit Bash gemacht.
GNU Bash, Version 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, Version 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
Das ist gut zu wissen, dass trap_output="$(trap)"
es funktioniert, um die Trap-Ausgabe zu erfassen. Ich kann mir keine andere Möglichkeit trap >trap_output_file
vorstellen, das zu tun , als es in eine Datei auszugeben (in der FIFO nicht funktioniert bash 3.2.57
) und es dann wieder einzulesentrap_output="$(<trap_output_file)"
fifo funktioniert nicht, bash 3.2.57
weil trap &
es leer ist, bash 3.2.57
aber nichtbash 4.4.12
GNU Bash, Version 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, Version 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