对于许多例子trap
使用trap ... INT TERM EXIT
的清理任务。但是真的有必要列出所有三个 sigspecs 吗?
手册上说:
如果 SIGNAL_SPEC 为 EXIT (0),则在退出 shell 时执行 ARG。
我相信这适用于脚本是否正常完成或因为它收到SIGINT
或SIGTERM
. 一个实验也证实了我的信念:
$ cat ./trap-exit
#!/bin/bash
trap 'echo TRAP' EXIT
sleep 3
$ ./trap-exit & sleep 1; kill -INT %1
[1] 759
TRAP
[1]+ Interrupt ./trap-exit
$ ./trap-exit & sleep 1; kill -TERM %1
[1] 773
TRAP
[1]+ Terminated ./trap-exit
Run Code Online (Sandbox Code Playgroud)
那为什么这么多例子一一列举INT TERM EXIT
呢?或者我错过了什么,有没有鞋底EXIT
会错过的情况?
我最近遇到了一些这样的脚本:
( set -e ; do-stuff; do-more-stuff; ) || echo failed
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来不错,但它不起作用!将set -e
不适用,当你添加的||
。没有它,它工作正常:
$ ( set -e; false; echo passed; ); echo $?
1
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加||
,set -e
则忽略:
$ ( set -e; false; echo passed; ) || echo failed
passed
Run Code Online (Sandbox Code Playgroud)
使用真正的、单独的 shell 可以按预期工作:
$ sh -c 'set -e; false; echo passed;' || echo failed
failed
Run Code Online (Sandbox Code Playgroud)
我已经在多个不同的 shell(bash、dash、ksh93)中尝试过这个,并且都以相同的方式运行,所以这不是一个错误。有人可以解释一下吗?
我有这三行:
export bunion_uds_file="$bunion_socks/$(uuidgen).sock";
"$cmd" "$@" | bunion
rm -f "$bunion_uds_file"
Run Code Online (Sandbox Code Playgroud)
我需要确保最后一行总是执行..我可以这样做:
export bunion_uds_file="$bunion_socks/$(uuidgen).sock";
(
set +e
"$cmd" "$@" | bunion
rm -f "$bunion_uds_file"
)
Run Code Online (Sandbox Code Playgroud)
或者像这样:
export bunion_uds_file="$bunion_socks/$(uuidgen).sock";
"$cmd" "$@" | bunion && rm -f "$bunion_uds_file" || rm -f "$bunion_uds_file"
Run Code Online (Sandbox Code Playgroud)
我假设创建子外壳并使用 set +e 的性能稍低等。