web-dev-qa-db-ja.com

lsへのUnixパイプ

私はこれまで* nixパイプを理解したと思っていました... Android Studioのインストールにシンボリックリンクするstudioという実行可能ファイルがあり、リンク先の場所を取得できると想定していました

which studio | ls -l

しかし、それはうまくいきません。それが私に与えることは、現在のディレクトリでls -lを実行することと同じです。

which studioを実行すると、/home/me/bin/studioが表示されます。そして、ls -l /home/me/bin/studioを実行すると、シンボリックリンクの場所を示す期待される出力が得られます。

では、なぜパイプバージョンが機能しないのでしょうか。パイプについて何を調べていないのですか?

36
hcarver

そのためには、xargsが必要です。

which studio | xargs ls -l

man xargsから:

xargs-標準入力からコマンドラインをビルドして実行する

パイプがどのように機能するかを完全に理解するには、 BASHでのパイプの機能に関する簡単な説明は何ですか?

Unixパイプは、最初のプロセスのSTDOUT(標準出力)ファイル記述子を2番目のプロセスのSTDIN(標準入力)に接続します。その後、最初のプロセスがそのSTDOUTに書き込むと、その出力は2番目のプロセスによって(STDINから)すぐに読み取ることができます。

lsは、引数を標準入力からではなく、コマンドラインから読み取ります。コマンドラインでディレクトリを取得するには、コマンド置換を使用する必要があります。

ls -l "$( which studio )"

(パスに空白が含まれる可能性がある場合は、二重引用符が必要です。)

21
choroba

ls -lは入力を取りませんので、which studioの出力に関しては何もしません。ここで重要なことは、標準入力と引数の違いを理解することです。標準入力は、scanfプロシージャを使用して(たとえばCのプログラムによって)読み取られる特殊ファイルであり、プログラムへの引数はargvおよびargcパラメータ。 argvはnullで終了するcharの配列の配列で、argcはその配列の長さです。

1
lamg