web-dev-qa-db-ja.com

プログラムの出力をパイプ付きの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

ご覧のとおり、最後のファイルの名前のみが出力されます。パイプはtailの出力を受け取り、サブシェルコマンドの場合と同様に、その名前のファイルを処理すると思いました。

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

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

1
user1717828
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
2
mikeserv

xargsコマンドを使用します。

$ ls -ctr | tail -1 | xargs cat

これにより、tail -1コマンドのSTDOUTが取得され、catコマンドのSTDINとして使用する代わりに、catコマンドのオプションとして使用されます。

6
John

あなたは次のようなことを試すことができます

_less $(ls -ctr | tail - 1)
_

$(...)は普遍的ではないので、バッククォートを置き換える必要があるかもしれません)。 lessを好みに変更します。

0
vonbrand