对于许多例子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
使用 …