我在很多shell脚本中都看过这行,但我不明白它的效果。有人可以解释一下吗?
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
答案 0 :(得分:5)
它创建一个临时文件并将其路径放在$ tempfile变量中。
`tempfile 2>/dev/null`
运行tempfile命令(man tempfile
)并丢弃所有错误消息。如果成功,则返回新创建的临时文件的名称。如果失败,则返回非零值,在这种情况下,命令的下一部分将运行。
对于命令this || that
,that
仅在this
失败时运行,即返回非零。
$$
是bash中的一个变量,它扩展为shell的进程ID。 (比较ps
和echo $$
的结果。)因此tempfile=/tmp/test$$
会扩展为tempfile=/tmp/test2278
。
据推测,稍后在脚本中,有些内容会写入$ tempfile。
答案 1 :(得分:3)
shell有一个单独的命名空间命名空间(使其成为Lisp-2,LOL),它在脚本行中被利用。 tempfile
是一个命令,用于计算与tempfile
变量无关的tempfile
变量的值。 2> /dev/null
生成一个适合用作临时文件名的路径名。 tempfile
将任何错误消息从/dev/null
重定向到command1 || command2
(2是标准错误文件描述符)。 tempfile
逻辑意味着“如果command1失败则执行command2”。如果我们无法从/tmp/test$$
获取临时名称,那么我们使用$$
,其中{{1}}是一个特殊的内置shell参数,它扩展为shell自己的进程ID。
答案 2 :(得分:2)
tempfile创建一个文件名类似于/tmp/tmp.XXXXXX的临时文件
2> / dev / null将命令输出重定向到/ dev / null设备,它只是抛弃它。此重定向只是忽略创建临时文件时的任何错误。
||将两个命令链接在一起如果第一个失败,则执行第二个。如果第一个成功则没有其他事情发生。
$$是当前shell的pid,这意味着如果tempfile命令失败,如果进程'pid为6052,则tempfile变量仍将包含/ tmp / test6052形式的字符串。
答案 3 :(得分: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
中获取内容。
答案 4 :(得分:0)
你看过man tempfile吗?
该行正在尝试使用tempfile(1)
生成临时文件名,并将其存储在$tempfile
中。如果失败(“||”,“或”部分),它将回退到/tmp/test$$
的显式文件名,其中$$
为the PID of the executing script。