なぜ私はこのようなことができないのですか?
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
-
ファイル名が検出され、tail
2番目のファイルの代わりにコマンドから読み込まれます。これはいくつかのユーティリティ(例えば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