Bash 什么';这些shell脚本的含义是什么?

Bash 什么';这些shell脚本的含义是什么?,bash,shell,Bash,Shell,有人能给我解释一下这些shell脚本的含义吗 # ......... tmpfile=`tmpfile 2>/dev/null` || tmpfile=/tmp/test$$ trap "rm -f $tmpfile" 0 1 2 5 15 # ......... 还有,下面两个,哪一个更好 tmpfile=`tmpfile 2>/dev/null` tmpfile=$(tmpfile 2>/dev/null) 我很少使用trap命令和|操作符,我查阅了手册,但仍然不知道。

有人能给我解释一下这些shell脚本的含义吗

# .........
tmpfile=`tmpfile 2>/dev/null` || tmpfile=/tmp/test$$
trap "rm -f $tmpfile" 0 1 2 5 15
# .........
还有,下面两个,哪一个更好

tmpfile=`tmpfile 2>/dev/null`
tmpfile=$(tmpfile 2>/dev/null)

我很少使用
trap
命令和
|
操作符,我查阅了手册,但仍然不知道。

此行创建了一个临时文件。如果
tmpfile
失败,它的errorlevel代码将传递给子shell,子shell将在其中转发给调用shell。如果代码为非零,则将使用默认文件
/tmp/test$
|tmpfile=/tmp/test$
$$
是保存它的shell的进程id号

tmpfile=`tmpfile 2>/dev/null` || tmpfile=/tmp/test$$
这个函数为shell创建了一个陷阱,当接收到信号0、1、2、5和15时,shell调用
rm-f$tmpfile
。有关此列表,请参见
kill-l

trap "rm -f $tmpfile" 0 1 2 5 15
在POSIX系统中,最好在一对反引号上使用
$()
。用它来盖他们就行了<代码>$()还允许使用反引号对进行很难(需要递归引用)的递归

tmpfile=`tmpfile 2>/dev/null`
tmpfile=$(tmpfile 2>/dev/null)

See当且仅当command1返回非零退出状态时才执行command2。那么,
rm-f$tmpfile
何时实际发生?我以为它会立即删除那个tmpfile,是吗?@Daniel:一旦收到任何信号,就会发生这种情况。它只有在收到信号0、1、2、5、15时才会采取行动(删除文件)。我不确定这些信号是否在shell退出时被默认捕获。但如果一个进程发送一个信号(大部分时间是SIGTERM(15)),它肯定会。当以交互方式按下键盘上的Ctrl-C时,也会收到SIGINT(2)。SIGHUP(1)也是终止进程时的常见信号。虽然包括0和5,但我觉得很奇怪。不知怎么的,我觉得很难说它们是否普遍。陷阱1,2,和15实际上是不寻常的,只有当你不想让你的外壳在收到这些信号时死亡时才使用。换句话说,陷阱拦截信号,当捕捉到信号时,通常的行为被阻止。在一个运行带有陷阱(比如15)的循环的脚本中,在该脚本进程上发送SIGTERM信号可以防止它被终止,循环仍然会继续,除非陷阱本身调用exit。我只是尝试捕获这些信号。我刚刚意识到,陷阱0实际上会在shell或脚本退出时进行陷阱调用。