日常を淡々と綴ります。さんが「シェルスクリプトでハマった件→【募】ステキな回避方法」でお題を出されていて、それに回答してみました。その内容はリンク先を見てもらうとして、回答の中で使ったbashのプロセス置換について書かれた記事をあまり見ないので、回答で使ったプロセス置換のことをエントリにしてみたいと思います。最初に注意点ですが、プロセス置換の機能は、bashやzsh*1の機能でPOSIX互換の機能ではありません。明示的に指定する必要があります。いうコマンドは失敗します。違い」を見てみてください。見ると以下のように書かれています。expansion.これだけではよくわからないと思うので、出力対象として使った場合、入力対象として使った場合の使用例をご紹介します。>(list)出力対象にプロセス置換を指定すると、例えば以下のようなことができます。僕としては、一番最初の例をよく使います。以降の出力はすべて画面に出力されるとともにログファイルにも記録される。<(list)こちら側の使い方では、処理済みテキストを渡したい場合に汎用的に使うことができます。いくつか例を挙げます。diffの入力対象に処理済みテキストを渡す一番よくある使い方はdiffと組み合わせて使う方法です。diffは、入力対象としてファイルのみを対象としているため、通常のパイプで処理済みテキストを渡すことができません。プロセス置換を使うことで、コマンドで処理した結果同士をdiffで比べることができます。inputfile)inputfileの中で、"exclude"という言葉が入っている行を除外してWhileループを回すプロセス置換は、あたかもファイルであるかのように扱うことができるので、Whileループにも渡すことができます。以下の2つは同等の内容になります。"exclude")プロセス置換を使うとこのように一時ファイルへの書き出しを行う必要がなくなり、処理後に削除するなどといった扱いを気にする必要がなくなります。プロセス置換」などのワードで検索するとほかにもいろいろ例が出てくると思います。しても一時ファイルを書きたくない、という場合以外は、必ず使わなければいけない機能ではないですが、覚えているとスクリプトをシンプルかつ見通しよく書ける場合があります。僕も応用例にはあまり詳しくないので、ほかにいい活用例があれば教えてもらえると嬉しいです。<追記>プロセス置換を使ったタイムスタンプ付きフィルタの例として、OpenStack開発環境のDevStackにちょうどいい例があるので、そちらもご紹介。DevStackのスクリプトは、bashの便利機能を多用しているので非常にいいサンプルになります。bash固有の機能を知らないとどこでログにタイムスタンプが付けられているのかを理解するのが難しい...。http://devstack.org/http://devstack.org/stack.sh.html以下は「stack.sh」の該当箇所のみの引用ですが、スクリプト本体にはコメントがないので、上記のサイトの解説から引っ張ってコメントにしています。8/18>ブコメで以下のコメントをもらったので、ここで出しているwhileループの例について補足します。すればいいのでは?僕が出していた例は、確かにコメントでいただいたものでも結果は変わりません。お題がパイプに伴う変数の扱いの問題で、コメントでいただいたようにパイプでつないだ場合、「ループ内で変数を変更してもそれがメインシェルの変数に反映されない」*4という問題に引っかかります。ここではパイプを使わない場合の例を書きました。以下のスクリプトを実行してみます。上と同様の結果???2つのループの違いは、パイプかプロセス置換での擬似的なファイル入力かだけですが、こちらの出力結果は、以下のようになります。firstsecond前者の場合は、var="second"への変更がWhile内部だけでしか有効にならないため、その外にあるvar変数に反映されません。後者ではwhileループの中で変数変更が反映されています。*5この辺りはお題のエントリの解答編に詳しく書かれているので、そちらをご参照ください。*1:プロセス置換は、zshでも使えるようですが、僕自身はzsh使いではないので、ここでは触れません*2:プロセス置換を使わなくてもファイルに標準出力と標準エラー出力をリダイレクトして、それをtailすることで実現できますが、そうすると別途tailのプロセスの扱いを考えたりする必要があって手間がかかります。コマンドパイプラインの変数値変更はそのコマンドラインローカルになるから」ということではないかということが書かれていました。自分の手元で実験した限りでは、確かに指摘の通りで、サブシェルを使わない場合でも同じ現象となりました。*5:一時ファイルを使った場合もプロセス置換と同様の結果になります。サーバ擬人化エヴァンジェリスト。昼間は実家の猫たちのために働くITインフラエンジニア。最近は工場長としてインフラエンジニア双六やかるたを作ったり。【免責】このブログに書かれていることは、私の個人的な見解であり、所属企業・組織の意見を代表するものではありません。読者になるサークルの新作ゲーム新作『汝はエンジニアのような名状しがたい何かなりや?』デスマーチ末期を舞台にした人狼ゲーム。運用を開始して半月経ったのでメモ月別アーカイブ広告キムワイプはてなブログをはじめよう!sechiroさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。