我在许多 shell 脚本中都看到过这一行,但我不明白它的效果。有人可以解释一下吗?
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
它创建一个临时文件并将其路径放在 $tempfile 变量中。
`tempfile 2>/dev/null`
运行 tempfile 命令 ( man tempfile
) 并丢弃任何错误消息。如果成功,则返回新创建的临时文件的名称。如果失败,则返回非零值,在这种情况下,命令的下一部分运行。
对于命令this || that
,that
仅在this
失败时运行,即返回非零。
$$
是 bash 中的一个变量,它扩展为 shell 的进程 ID。(比较 和 的结果ps
。echo $$
)所以tempfile=/tmp/test$$
将扩展为tempfile=/tmp/test2278
.
据推测,稍后在脚本中,有东西写入 $tempfile。
shell 有一个单独的命令和变量命名空间(使其成为 Lisp-2,LOL),它在您的脚本行中被利用。tempfile
是一个命令,用于计算与tempfile
它无关的变量的值。tempfile
生成适合用作临时文件名的路径名。2> /dev/null
将任何错误消息重定向tempfile
到/dev/null
(2 是标准错误文件描述符)。逻辑意味着,“如果 command1 失败,command1 || command2
则执行 command2”。如果我们不能从 获得临时名称tempfile
,那么我们使用/tmp/test$$
,其中$$
是一个特殊的内置 shell 参数,它扩展为 shell 自己的进程 ID。
tempfile 创建一个临时文件,其文件名类似于 /tmp/tmp.XXXXXX
2>/dev/null 将命令输出重定向到 /dev/null 设备,该设备只是将其丢弃。此重定向只是忽略创建临时文件时的任何错误。
|| 将两个命令链接在一起。如果第一个失败,则执行第二个。如果第一个成功,则不会发生任何其他事情。
$$ 是当前 shell 的 pid,这意味着如果 tempfile 命令失败,如果进程的 pid 为 6052,则 tempfile 变量仍将包含格式为 /tmp/test6052 的字符串。
该行的第一部分,直到||
,运行程序tempfile
并在变量中捕获标准输出,从而tempfile
消除错误。还有一个退出状态:成功为零或失败非零(执行tempfile
命令失败或tempfile
命令运行时报告的失败)。
意思是“||
如果 LHS(左侧)失败,则执行 RHS(右侧)”。
因此,如果tempfile
命令有问题,将使用 RHS,为tempfile
(变量)分配一个更简单的临时文件名。
总的来说,它相当于:
if tempfile=`tempfile 2>/dev/null`
then : OK
else tempfile=/tmp/test$$
fi
只有它在一条线上,而不是四条线上。
我敢肯定,这个想法是要了解$tempfile
该命令是否tempfile
存在于机器上。
你看过man tempfile吗?
该行试图用来tempfile(1)
生成一个临时文件名,将其存储在$tempfile
. 如果失败(“||”、“或”部分),它会回退到显式文件名/tmp/test$$
,其中$$
是执行脚本的 PID。