嗨,我在Linux服务器上运行一个命令。
tail -3 `ls -1t nnnn* | head -1`
当nnnn文件存在时,一切正常。
当nnnn文件不存在时,tty将挂起,直到^C
nt-home-stg>> tail -3 `ls -1t nnnn* | head -1`
ls: No match.
在ls: No match.
之后,它将挂起,直到按下ctrl c(^c)。
我在网上搜索了一下,没有找到答案。
已经尝试了传统的抑制>& /dev/null
和2>/dev/null
。没有帮助。
有没有办法让命令结束而不挂起?
1条答案
按热度按时间5m1hhzi41#
反勾语法替换给定命令的输出;当该命令返回一个文件名时,您将得到类似于以下内容的内容:
但如果没有匹配项,则没有可替换的内容,因此您实际上运行:
如果我们查看
man tail
下的摘要,我们会看到tail
未指定文件名时的行为:如果没有FILE或FILE为-,则读取标准输入。
tail
正在等待输入,然后显示输入的最后3行。实际上,您可以键入几行文本,然后按Ctrl-D(“end of file”),您将看到它发生。这看起来似乎毫无意义,但是命令并不知道(或关心)它是被直接调用的,而不是作为管道的一部分,所以内部查询中的
head -1
实际上也在做同样的事情:阅读标准输入,因为您没有给予文件名。为了避免这种情况,你应该在运行tail之前先测试你的文件是否存在。一个不优雅的方法是将文件名写在一行中,然后使用
[
(akatest
)来Assert它是非空的:这仍然会给予您来自
ls
的glob失败的警告,但是会跳过挂起的tail
。