Ich habe folgendes Skript ausprobiert:
#!/bin/bash
trap 'echo "touching a file" && touch $FILE' EXIT
foo1(){
echo "foo1"
}
foo(){
echo "foo"
export FILE=${FILE:-/tmp/file1}
}
(foo1)
foo
Die Ausgabe für das obige Skript war:
[root@usr1 my_tests]# ./test.sh
foo1
foo
touching a file
Ich hatte jedoch damit foo1
gerechnet, dass die Falle auch beim Verlassen aufgerufen wird , was in einer Unterschale heißt.
- Wird das erwartet?
- Wird
trap
von einer Unterschale geerbt? - Wenn ja, in welchem Fall wird
trap
eine Unterschale vererbt?
Antworten:
Trap-Handler werden niemals von Subshells geerbt. Dies wird von POSIX festgelegt :
Beachten Sie, dass ignorierte Signale (
trap '' SIGFOO
) in der Subshell (und auch in externen Programmen, die von der Shell gestartet werden) ignoriert werden.quelle
set -E
, um Subshells zu haben, Traps erben, aber es ist WIRKLICH schwierig, es richtig zu machen (zumindest nach meiner Erfahrung).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):
GNU Bash, Version 3.2.57 (1) -Release (x86_64-apple-darwin16):
Das ist gut zu wissen, dass
trap_output="$(trap)"
es funktioniert, um die Trap-Ausgabe zu erfassen. Ich kann mir keine andere Möglichkeittrap >trap_output_file
vorstellen, das zu tun , als es in eine Datei auszugeben (in der FIFO nicht funktioniertbash 3.2.57
) und es dann wieder einzulesentrap_output="$(<trap_output_file)"
fifo funktioniert nicht,
bash 3.2.57
weiltrap &
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):
GNU Bash, Version 3.2.57 (1) -Release (x86_64-apple-darwin16):
quelle
trap
Definitionen werden nicht an Unterschalen weitergegeben.Überprüfen durch:
trap "echo bla" 1 2 3"
(trap)
quelle
(trap)
als Sonderfall behandelt, sodass die Subshell die Überfüllungen der übergeordneten Shell melden (aber nicht verwenden) kann. Dieser Test ist also nicht immer zuverlässig.ksh88
,bosh
(schily Bourne Shell) undheirloom-sh
. Sie haben recht:ksh93
verhält sich anders.bash
Gibt nichts aus, wenn Sie anrufen(trap)
.