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
subshellコマンドと同じように、その名前のファイルをインポートして処理すると思いました。
$ cat $(ls -ctr | tail -1)
file 3 contents
リダイレクト方法が機能しないのはなぜですか。サブシェルの代わりにパイプを使用してこれを行う方法はありますか?
答え1
xargs
次のコマンドを使用したいと思います。
$ ls -ctr | tail -1 | xargs cat
これはコマンドのSTDOUTを使用し、コマンドのSTDINtail -1
として使用するのではなく、コマンドのオプションとして使用します。cat
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
味を変えてみてください。