嗨,我在 Linux 服务器上运行命令。
tail -3 `ls -1t nnnn* | head -1`
当 nnnn 文件存在时,一切都很好。
当 nnnn 文件不存在时,tty 挂起直到 ^C </p>
nt-home-stg>> tail -3 `ls -1t nnnn* | head -1`
ls: No match.
在 ls 之后:不匹配。
它会挂起,直到按下 ctrl c (^c)。
我在网上搜索过,找不到答案。
已经试过传统的抑制>&/dev/null
和2>/dev/null
.没有帮助。
有没有办法让命令结束而不挂起?
最佳答案
反引号语法替换给定命令的输出;当该命令返回一个文件名时,您会得到如下内容:
tail -3 nnnn01.whatever
但是如果没有匹配项,就没有什么可以替代的,所以你有效地运行:
tail -3
如果我们查看 man tail
下的摘要,我们会看到如果未给 tail
文件名的行为:
With no FILE, or when FILE is -, read standard input.
所以 tail
正在等待一些输入被管道输入,然后它将显示该输入的最后 3 行。实际上,您可以键入几行文本,然后按 Ctrl-D(“文件结尾”),您就会看到它发生了。
这可能看起来毫无意义,但命令并不知道(或关心)它是被直接调用的,而不是作为管道的一部分。所以你内部查询中的 head -1
实际上在做同样的事情:读取标准输入,因为你没有给出文件名。
为避免这种情况,您应该先测试您的文件是否存在,然后再运行 tail。一种不优雅的写法是在一个变量中捕获文件名,并使用 [
(aka test
) 断言它是非空的:
(file=`ls -1t nnnn* | head -1`; [ -n "$file" ] && tail -3 $file)
这仍然会从 ls
发出 glob 失败的警告,但会跳过挂起的 tail
。
关于linux - unix tty 在尾部用尖音符号 (`) 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42831938/