我可以使用管道将程序的输出重定向到 cat 吗?

我可以使用管道将程序的输出重定向到 cat 吗?

我有一个包含三个文件和基本内容的文件夹:

$ tail *
==> file1 <==
file 1 contents

==> file2 <==
file 2 contents

==> file3 <==
file 3 contents

我想使用 来查看最新文件的内容cat。我尝试像这样使用它:

$ ls -ctr | tail -1
file3

$ ls -ctr | tail -1 | cat
file3

但如您所见,它只打印最后一个文件的名称。我认为管道会获取tail并处理具有该名称的文件,就像使用 subshel​​l 命令一样:

$ cat $(ls -ctr | tail -1)
file 3 contents

为什么重定向方法不起作用,有没有办法用管道而不是子 shell 来完成此操作?

答案1

你想使用xargs命令:

$ ls -ctr | tail -1 | xargs cat

这将采用命令的 STDOUT tail -1,而不是将其用作cat命令的 STDIN,而是将其用作cat命令的选项。

答案2

set   ./file[123]            ### set an arg array of the glob resolution
while [ "${2+:}" ]           ### while there are at least 2 args
do    [ "$1" -nt "$2" ] &&   ### if $1 is newer than $2 then ...
      set "$@" "$1"; shift   ### reset the array to itself + $1; shift regardless
done; cat <"$1"              ### after loop cat $1 or report no glob match

答案3

你可以尝试类似的东西

less $(ls -ctr | tail - 1)

(这$(...)不是通用的,您可能需要替换反引号)。改变less口味。

相关内容