パイプを使用してプログラム出力をcatにリダイレクトできますか?

パイプを使用してプログラム出力をcatにリダイレクトできますか?

3つのファイルと基本コンテンツを含むフォルダがあります。

$ 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

ただし、ご覧のとおり、最後のファイルの名前のみが印刷されます。私はパイプラインがtailsubshel​​lコマンドと同じように、その名前のファイルをインポートして処理すると思いました。

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

リダイレクト方法が機能しないのはなぜですか。サブシェルの代わりにパイプを使用してこれを行う方法はありますか?

答え1

xargs次のコマンドを使用したいと思います。

$ ls -ctr | tail -1 | xargs cat

これはコマンドのSTDOUTを使用し、コマンドのSTDINtail -1として使用するのではなく、コマンドのオプションとして使用します。catcat

答え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味を変えてみてください。

関連情報