linux - unix tty 在尾部用尖音符号 (`) 挂起

标签 linux ls tail unix-head

嗨,我在 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/null2>/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/

相关文章:

unix ls 目录及其子目录存在

python - 安装 gruobipy 包 - 错误

linux - 如何在vim中搜索没有前导字符的行

linux - 如何在脚本中运行 .profile

linux - 删除 bash 脚本中除最新 3 个以外的所有文件

c - 我想在文件中重定向 ls 的 execv,然后在管道中重定向,为什么不起作用?

linux - 如何将某些内核线程绑定(bind)到给定的内核?

linux - 对于给定数量的文件,如何显示最后几行中的几行?

linux - 如何检查文件大小是否没有增加,如果没有则杀死脚本的$$

linux - 如何跟踪写入同一日志文件的多个线程