2012-05-09 13 views
1

皆、私はこの奇妙な問題(多分それは機能です)を今日の午後発見しました。私が発行した場合 私の現在の作業ディレクトリでは、5つのファイル、すなわち、B、C、D、Eechoコマンドの出力をlsにパイプすることができません

があり、私は期待してどのような次のコマンド

echo "a" | ls -l 

は、ファイルAの唯一の詳細情報です。リストされます。 出力から、ファイルa、b、c、d、eの詳細情報がリストされます。 パイプの前のコマンドが機能していないかのように見えます。たとえば、ls -lが実行された場合とまったく同じように出力されます。

echo "whatever_you_type" | ls -l 

私は混乱していますが、誰でもこの問題を説明できますか? 私はxargsのようなものを使用してこの問題を回避することができます。echo "a" | xargs ls -l しかし、私はなぜそれを知りたいのですか?

+2

'ls'はstdinを読み込みません –

答えて

6

にスペースを含む任意のファイル名を持っていないことを確認してください。そのSTDINストリームに挿入します。 lsはstdinから読み込まないので、無視します。あなたが望むのは、パラメータがコマンドラインlsに渡されるということです。これは、このようなものを使用することによって達成することができます。

my_file="a" 
ls -l "$my_file" 

また、あなたはSTDIN入力からコマンドラインパラメータを構築するために使用することができますxargsを使用することができます。あなたのケースでは、あなたはそれがSTDIN入力の各スペースで区切られた文字列のためのls -l [filename]を実行します

echo "a" | xargs ls -l 

ようにそれを使用することができます。

+0

あなたの説明をありがとう。 – churchmice

3

lsstdinから入力がありません。 xargsは、入力から引数がアセンブルされて1回以上lsを呼び出すために機能します。あなたの例を達成するための 別の方法は次のようになります。

ls -l $(echo "a")

ちょうどあなた管内別のプロセスに何かを、それがプッシュされます場合は、あなたが

+0

あなたの説明もありがとう。 – churchmice

+0

私が提供した2番目のソリューションがより快適に感じられます。私にはもっと「自然」と思われる。私はxargsを使うことはありません。なぜなら、コマンドラインの中にある情報を得る方法が常にあるからです。 – Depado

+0

2つの発言:(1)この場合、サブシェルは不要です。変数を使用するだけです。 (2)ファイル名に空白や特殊文字がある可能性がわずかにある場合は、 'ls -l" $(echo "a") "'のように出力を引用する必要があります。一般的に、シェルスクリプトの引数については、引用符をあまりにも少なくすることはできません。 –

関連する問題