UNIXプロチャレンジその2

繰り返すようだがUNIXのプロが書く日記ではなくプロを目指す素人の勉強記である
では早速,本日のテーマは

・コマンド置換
・パイプラインとコマンド置換


コマンド置換
まず,結論から言うとコマンド出力を文字列に置換する.用法は

    $ command2 "引数1" `command1`
    もしくは
    $ command2 "引数1" $(command1)

これによって,command1 の結果が 引数2 となる.
実用例としては,

    $ grep "文字列2" `find ./ -name "文字列1*"`

カレントディレクトリ配下の 文字列1 を含むファイル名をfind.
その結果(file1 file2 file3 ...)が文字列に置換される.
それをgrepの2つ目の引数として渡され実行される.

なかなか便利そうである.これで用が足りないときはシェルスクリプトが登場するとのこと


パイプラインとコマンド置換
そこで素人の私は疑問に思ったことがある.
既に結論は上記の通りであるが,理解していなかった前提で記す,

そもそも,結果を渡すならばパイプラインもコマンド置換も同じではないか?
どちらの状況でパイプラインを,もしくはコマンド置換を使えばよいのか?

ここで,重要なことは「何が欲しい」か考えること
(例を挙げるために自宅にてcygwinで試していたら環境の違いか,良い例を再現できなかった)


分からず終いではつまらないので面白い実験を紹介しよう.
これは同期の強者に教えてもらったのだが,忘れないように記しておく.

まず,echoコマンドで適当な文字列をファイルにリダイレクトする.

    $ echo imas > echo ←echoという名のファイル
    $ echo hagiwara > yukiho
    $ echo shijo > takane

このディレクトリに上記以外のファイルがないとして

    $ ls

と入力すれば,結果は…

    echo takane yukiho

となる.言うまでもない.では,

    $ `ls`

というコマンドを実行したならどうなるだろうか?

    takane yukiho

となる.どういうことだろうか?
ここで,コマンド置換が行われている.
ようするにlsを実行した結果が文字列に置換されたのである.

    $ echo takane yukiho ($ echo 文字列)

このように書けば明白だろう.
関連項目であるがワイルドカード"*"もコマンド置換の一種である.
では,上記の環境で

    $ echo *

というコマンドを実行すると…

    echo takane yukiho

となる.何処かで見たかと思えばlsの実行結果である.


ここまで理解すると,パイプラインとコマンド置換の特性の違いが分かってくるのではないだろうか
4/15:一部修正しました.