パイプラインに問題があります。

パイプラインに問題があります。

なぜ私はこのようなことができないのですか?

tail -n 5 small.txt | diff small.txt

最初のコマンドの実行結果を独立した入力ではなく2番目のコマンドの2番目のパラメータに渡したいと思います。どうすればいいですか?

答え1

この試み...

  diff small.txt <(tail -n 5 small.txt)

答え2

努力するtail -n 5 small.txt | diff small.txt -

からman diff

FILEが"-"の場合、標準入力を読み込みます。

この-方法は、目的のタスクを正しく実行する方法を示しています。しかし、次の方法はいくつかを教えて(シェル)生活をより簡単にします。

diff small.txt <(tail -n 5 small.txt)

答え3

提案された方法でパイプを作成できない理由は、diffユーティリティがコマンドラインに2つの入力ファイルを要求し、デフォルトでtail標準入力ストリーム(出力)から読み取らないためです。

2番目の「ファイル」引数(またはファイルを比較したい順に最初の引数)を追加して、標準入力から読み取ることを示しますdiff-

tail -n 5 small.txt | diff small.txt -

diff-ファイル名が検出され、tail2番目のファイルの代わりにコマンドから読み込まれます。これはいくつかのユーティリティ(例えばdiff、、catなど)によって実装されたセマンティクスですが、普遍的ではありません(シェルは「標準入力と同じ」をpaste知らない)。-

その他bashサポートされているシェルプロセスの交換を使用すると、<( ... )特定のコマンドの出力を含む一時ファイル(またはFIFO)を生成するようにシェルに指示できます。

diff small.txt <( tail -n 5 small.txt )

これは本質的に(しかし技術的にはそうではありません)

tail -n 5 small.txt >tmpfile
diff small.txt tmpfile
rm -f tmpfile

関連情報