あなたの間違いは、コマンドが標準入力から受け取るのは引数であると仮定しています。そうではない。
ヘッドがパイプコマンドからデータを受け取るとき、ヘッドはデータストリームを受信します。 head
コマンドは、引数として渡された1つのファイルから読み取るのとまったく同じ方法でそのデータを読み取ります。それをこのように考えて(これは擬似コードである、それは動作しません):
PSEUDO_PIPELINE <= ls -p | grep -v/# Not valid shell syntax
head PSEUDO_PIPELINE # Not valid shell syntax
あり、実際にちょうどそれを表現する(有効な)方法であり、そしてそれは、プロセス置換と呼ばれている:
head <(ls -p | grep -v /)
これは観測した結果とまったく同じ(望ましくない)結果になりますが、パイプの前のコマンドが実際には引数リストではなくファイルであることをより明白にします。
標準入力(出力ストリームの標準出力と標準エラー)は、各コマンドが起動コンテキストから受け取るものです。それはあなたが望むなら "隠された議論"のようであり、プロセスはそれとやりとりすることができます(それは特別なファイルであるにもかかわらずファイルの最後に到達するまで読み込みますが、それにもかかわらず)。
ここでは、上記のコマンドの最初の10行10行を表示し、各ファイルの最初の10行を表示していないことを理解する必要があります。
あなたはこのような何かをしたいものを達成できます。
find . -mindepth 1 -maxdepth 1 -type f -exec printf "\n%s ------\n" {} \; -exec head {} \;
これは、それぞれのファイルを見つけ、その後、ヘッダ/区切り線、および各ファイルの最初の行を出力します。
コマンドが*期待していることをしない場合は、マニュアルページをお読みください! – hek2mgl
@ hek2mgl明らかに、それは私がやった最初のことでした – FlapJack
'head'がstdinからファイル名のリストを読み、それらの最初の10行を出力することをどうやって期待できますか? – hek2mgl