对于许多例子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会错过的情况?
$ ls -og /proc/self /proc/self/fd
lrwxrwxrwx 1 64 Jun 18 11:12 /proc/self -> 32157
/proc/self/fd:
total 0
lrwx------ 1 64 Jun 22 2012 0 -> /dev/tty1
lrwx------ 1 64 Jun 22 2012 1 -> /dev/tty1
lrwx------ 1 64 Jun 22 2012 2 -> /dev/tty1
lr-x------ 1 64 Jun 22 2012 3 -> /proc/32157/fd
Run Code Online (Sandbox Code Playgroud)
默认分配的文件描述符3是什么?
假设你尝试过这样的事情:
$ paste ../data/file-{A,B,C}.dat
Run Code Online (Sandbox Code Playgroud)
并意识到您想在粘贴之前对每个文件进行排序(假设是数字)。然后,使用进程替换,您需要编写如下内容:
$ paste <(sort -n ../data/file-A.dat) \
<(sort -n ../data/file-B.dat) \
<(sort -n ../data/file-C.dat)
Run Code Online (Sandbox Code Playgroud)
在这里你会看到很多重复,这不是一件好事。因为每个进程替换都是相互隔离的,所以不能使用任何跨越多个进程替换的大括号扩展或路径名扩展(通配符)。
是否有一种工具可以让您以紧凑的方式(例如通过给予sort -n和../data/file-{A,B,C}.dat单独)编写并为您编写整个命令行?
我试图通过解析输出,检查运行和排队的PBS作业的数量qstat -tn1从bash脚本。到目前为止,这已经奏效:
count ()
{
qstat -tn1 | awk '
BEGIN { R = 0; Q = 0; }
$10 == "R" { R++ }
$10 == "Q" { Q++ }
END { print R, Q }'
}
if read -r R Q < <(count)
...
Run Code Online (Sandbox Code Playgroud)
但是,我看到qstat偶尔会因未知原因而失败。在这种情况下,它不会向 打印任何内容stdout和一些错误消息stderr,并以非零状态(相当标准)退出。但是,awk不知道qstat失败了,并且很高兴地打印0 0了它收到的空输入。然后read将 0 分配给两者,R并且Q不知道qstat实际上失败了。
R并Q使用 …