相关疑难解决方法(0)

“trap ... INT TERM EXIT”真的有必要吗?

对于许多例子trap使用trap ... INT TERM EXIT的清理任务。但是真的有必要列出所有三个 sigspecs 吗?

手册上说

如果 SIGNAL_SPEC 为 EXIT (0),则在退出 shell 时执行 ARG。

我相信这适用于脚本是否正常完成或因为它收到SIGINTSIGTERM. 一个实验也证实了我的信念:

$ 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会错过的情况?

shell bash signals trap

80
推荐指数
4
解决办法
7万
查看次数

为什么 set -e 在带有括号 () 后跟 OR 列表 || 的子shell 中不起作用?

我最近遇到了一些这样的脚本:

( 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)中尝试过这个,并且都以相同的方式运行,所以这不是一个错误。有人可以解释一下吗?

shell shell-script

42
推荐指数
2
解决办法
9427
查看次数

尝试/最后使用 bash shell

我有这三行:

  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 的性能稍低等。

shell bash exit-status

3
推荐指数
1
解决办法
987
查看次数

标签 统计

shell ×3

bash ×2

exit-status ×1

shell-script ×1

signals ×1

trap ×1