linux unix tty在尾部后挂起,带锐音符(')

6l7fqoea  于 2023-01-25  发布在  Linux
关注(0)|答案(1)|浏览(114)

嗨,我在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/null2>/dev/null。没有帮助。
有没有办法让命令结束而不挂起?

5m1hhzi4

5m1hhzi41#

反勾语法替换给定命令的输出;当该命令返回一个文件名时,您将得到类似于以下内容的内容:

tail -3 nnnn01.whatever

但如果没有匹配项,则没有可替换的内容,因此您实际上运行:

tail -3

如果我们查看man tail下的摘要,我们会看到tail未指定文件名时的行为:
如果没有FILE或FILE为-,则读取标准输入。
tail正在等待输入,然后显示输入的最后3行。实际上,您可以键入几行文本,然后按Ctrl-D(“end of file”),您将看到它发生。
这看起来似乎毫无意义,但是命令并不知道(或关心)它是被直接调用的,而不是作为管道的一部分,所以内部查询中的head -1实际上也在做同样的事情:阅读标准输入,因为您没有给予文件名。
为了避免这种情况,你应该在运行tail之前先测试你的文件是否存在。一个不优雅的方法是将文件名写在一行中,然后使用[(aka test)来Assert它是非空的:

(file=`ls -1t nnnn* | head -1`; [ -n "$file" ] && tail -3 $file)

这仍然会给予您来自ls的glob失败的警告,但是会跳过挂起的tail

相关问题