プロセス置換

きっかけは RVM(Ruby Version Manager) をインストールしようとしたときだった。
Github の Repository を使ったインストール方法に以下のコマンドが書かれていた。

bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

http://rvm.beginrescueend.com/rvm/install/

このコマンドが何をやっているのかよくわからなかったので、調べてみた*1

環境
<( curl http://rvm.beginrescueend.com/releases/rvm-install-head )

プロセス置換、という機能。括弧の中のコマンドの出力があるファイルディスクリプタ*2に接続された状態で実行される。この場合は curl で GET した内容がファイルディスクリプタに出力される。
「<()」ではなく「=()」という書き方もできて、この場合は一時ファイルが利用される。

% ls <(echo hello) 
/dev/fd/11
% ls =(echo hello)
/tmp/zshuJPY72
bash

これはすぐわかる。リダイレクトで bash にデータを渡している。ただ、シェルにスクリプトをリダイレクトさせて実行するという方法を初めて見た。
よくよく考えるとできて当然だよね。コマンドの入力元がキーボードからフィアルに変わっただけだから。

まとめると

Webサーバ上においてあるスクリプトをダウンロードし、実行している。その際、ダウンロードしたスクリプトはファイルディスクリプタを介してシェルに渡るため、ローカルサーバにはファイルとして存在しない。
これが役立つ状況ってどんな時だろうか?例えば、サーバを運用していて自動化したい作業があるけど、サーバ上にはよけいなファイルを置きたくない場合とか?ん〜どうだろ。

foo:~% ssh bar.example.jp "zsh < <(curl http://foo.example.jp/some_script)"
# foo が管理サーバで bar が管理されるサーバ。 foo にスクリプトが置いてある。


あと、プロセス置換だけで言えば、http://journal.mycom.co.jp/column/zsh/012/index.html に書かれているような使い方かな (diff とか)。

*1:このエントリのカテゴリは zsh になってて、インストール時のコマンドは bash になっているけど、気にしない

*2:ファイルディスクリプタという書き方はおかしいよね。/dev/fd/xxx のことってなんて言うのかしらん。デバイス?