1

我在许多 shell 脚本中都看到过这一行,但我不明白它的效果。有人可以解释一下吗?

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
4

5 回答 5

5

它创建一个临时文件并将其路径放在 $tempfile 变量中。

`tempfile 2>/dev/null`

运行 tempfile 命令 ( man tempfile) 并丢弃任何错误消息。如果成功,则返回新创建的临时文件的名称。如果失败,则返回非零值,在这种情况下,命令的下一部分运行。

对于命令this || thatthat仅在this失败时运行,即返回非零。

$$是 bash 中的一个变量,它扩展为 shell 的进程 ID。(比较 和 的结果psecho $$)所以tempfile=/tmp/test$$将扩展为tempfile=/tmp/test2278.

据推测,稍后在脚本中,有东西写入 $tempfile。

于 2012-03-18T16:36:44.313 回答
3

shell 有一个单独的命令和变量命名空间(使其成为 Lisp-2,LOL),它在您的脚本行中被利用。tempfile是一个命令,用于计算与tempfile它无关的变量的值。tempfile生成适合用作临时文件名的路径名。2> /dev/null将任何错误消息重定向tempfile/dev/null(2 是标准错误文件描述符)。逻辑意味着,“如果 command1 失败,command1 || command2则执行 command2”。如果我们不能从 获得临时名称tempfile,那么我们使用/tmp/test$$,其中$$是一个特殊的内置 shell 参数,它扩展为 shell 自己的进程 ID。

于 2012-03-18T16:39:28.793 回答
2

tempfile 创建一个临时文件,其文件名类似于 /tmp/tmp.XXXXXX

2>/dev/null 将命令输出重定向到 /dev/null 设备,该设备只是将其丢弃。此重定向只是忽略创建临时文件时的任何错误。

|| 将两个命令链接在一起。如果第一个失败,则执行第二个。如果第一个成功,则不会发生任何其他事情。

$$ 是当前 shell 的 pid,这意味着如果 tempfile 命令失败,如果进程的 pid 为 6052,则 tempfile 变量仍将包含格式为 /tmp/test6052 的字符串。

于 2012-03-18T16:39:19.323 回答
0

该行的第一部分,直到||,运行程序tempfile并在变量中捕获标准输出,从而tempfile消除错误。还有一个退出状态:成功为零或失败非零(执行tempfile命令失败或tempfile命令运行时报告的失败)。

意思是“||如果 LHS(左侧)失败,则执行 RHS(右侧)”。

因此,如果tempfile命令有问题,将使用 RHS,为tempfile(变量)分配一个更简单的临时文件名。

总的来说,它相当于:

if tempfile=`tempfile 2>/dev/null`
then : OK
else tempfile=/tmp/test$$
fi

只有它在一条线上,而不是四条线上。

我敢肯定,这个想法是要了解$tempfile该命令是否tempfile存在于机器上。

于 2012-03-18T16:37:43.247 回答
0

你看过man tempfile吗?

该行试图用来tempfile(1)生成一个临时文件名,将其存储在$tempfile. 如果失败(“||”、“或”部分),它会回退到显式文件名/tmp/test$$,其中$$执行脚本的 PID

于 2012-03-18T16:37:58.347 回答