私はこれまで* nixパイプを理解したと思っていました... Android Studio
のインストールにシンボリックリンクするstudio
という実行可能ファイルがあり、リンク先の場所を取得できると想定していました
which studio | ls -l
しかし、それはうまくいきません。それが私に与えることは、現在のディレクトリでls -l
を実行することと同じです。
which studio
を実行すると、/home/me/bin/studio
が表示されます。そして、ls -l /home/me/bin/studio
を実行すると、シンボリックリンクの場所を示す期待される出力が得られます。
では、なぜパイプバージョンが機能しないのでしょうか。パイプについて何を調べていないのですか?
そのためには、xargs
が必要です。
which studio | xargs ls -l
man xargs
から:
xargs-標準入力からコマンドラインをビルドして実行する
パイプがどのように機能するかを完全に理解するには、 BASHでのパイプの機能に関する簡単な説明は何ですか? :
Unixパイプは、最初のプロセスのSTDOUT(標準出力)ファイル記述子を2番目のプロセスのSTDIN(標準入力)に接続します。その後、最初のプロセスがそのSTDOUTに書き込むと、その出力は2番目のプロセスによって(STDINから)すぐに読み取ることができます。
ls
は、引数を標準入力からではなく、コマンドラインから読み取ります。コマンドラインでディレクトリを取得するには、コマンド置換を使用する必要があります。
ls -l "$( which studio )"
(パスに空白が含まれる可能性がある場合は、二重引用符が必要です。)
ls -l
は入力を取りませんので、which studio
の出力に関しては何もしません。ここで重要なことは、標準入力と引数の違いを理解することです。標準入力は、scanf
プロシージャを使用して(たとえばCのプログラムによって)読み取られる特殊ファイルであり、プログラムへの引数はargv
およびargc
パラメータ。 argv
はnullで終了するcharの配列の配列で、argc
はその配列の長さです。