【コラム】
リダイレクトはシェルに欠かせない機能の一つだ。標準出/入力をファイルへ向けたり、標準出力を標準エラー出力へ向けたり、また、その逆もできる。リダイレクトはできるシェル使いの第1歩。"command > /dev/null 2>&1"とかっこよくやってみたいもの。
zshも当然リダイレクト機能を持っている。しかし、zshのリダイレクトはbashやtcshのそれとはひと味違う。zshでは最初からリスト1.1の設定が有効になっており、bashやtcshではデフォルトでは実現されていない機能もサポートしている。今回はzshのリダイレクト機能を紹介しておこう。
echoコマンドでテキストを出力して、リダイレクトさせてファイルへ書き込む。これはシェル操作の最初の一歩だが、zshではこれをプロンプト2.1のように書ける。tcshでは「> file1 > file2」はAmbiguous output redirectとしてエラー扱いになって処理されないし、bashではfile2の方にだけテキストが書き込まれる。zshだと両ファイルともに同じテキストが書き込まれる。
ちなみにzshの場合、catコマンドを使わずともプロンプト2.2のように記述することでmoreコマンドと同じような処理をさせることができる。当然、zshなら入力のリダイレクトも複数いける。つまりプロンプト2.3のように書くこともできる。
プロンプト2.3は通っぽい書き方ではあるが、環境変数や設定で動作がかわるしパイプの後では使えない。そもそも一目見て意味わかりにくいので、一通り遊んだあとはいつもどおりコマンドを書く方法を使った方がいいかも。ただし、ここぞというときにおとなりと差をつけられるかも?
zshのすばらしい点はこれだけにとどまらない。パイプを組み合わせてもっとアグレッシブなことができる。たとえばプロンプト3.1をみてほしい(コマンド行先頭の「<」はcatコマンドのかわりで使っている。せっかくなのでこの書き方にしてみたが、ここはcatにしてもいいだろう)。file1の内容をfile3にコピーしているわけだが、これをプロンプト3.2のように記述すると、標準出力にもfile1の内容が出力されるのだ。
プロンプト3.2は、bashなら標準出力にはなにも出力されないし、tcshならAmbiguous output redirectになってエラー扱いで処理すらされない。しかしzshならパイプもリダイレクトのように複数入出力の対象になる。これは使いだすと結構便利だったりする。
ちなみにパイプではなく、リダイレクトで同じこともできる。プロンプト3.3のようにリダイレクト先に/dev/stdinを追加すればいい。
この処理は、コマンドから出力されるメッセージをファイルに落としながらもターミナルにも流しておきたいという場合によく利用するteeコマンドと同じだ。zshの場合、teeコマンドを使わなくともリダイレクトやパイプを組み合わせるだけで実現できるというわけだ。
teeコマンドと同じ処理をするくらいならteeコマンドを使えばいいわけで、このマルチリダイレクトがその本領を発揮するのは複数のリダイレクトをやりたいというシーンだろう。シェルスクリプトで複数のリダイレクトをつかって変態的ワンライナーを作るとことが簡単に進むことがある。shでは難しいこのシチュエーションも、zshを使ってしまえば問題ない。
zshのリダイレクトはファイブグロブとも連系している。たとえばプロンプト4.1のように書いた場合、file1、file2、file3の全てに"hello world"を書き込みたいという気持ちは伝わってくるものの、実際にはfile1に"hello world file2 file3"が書き込まれるだけで、file2とfile3には何もおこならない。
しかし、これをファイルグロブを使ってプロンプト4.2のように実行すると、グロブで展開されるファイルすべての対して"hello world"が書き込まれる。つまりecho "hello world" > file?が"hello world" > file1 > file2 > file3に展開されるわけだ。
当然これは入力へのリダイレクトに対しても同じように機能する。つまり、プロンプト4.3のようにすると当然エラーだが、プロンプト4.4のようにするとすべてのファイルが標準入力になるという寸法だ。
ちなみに、これまでbashを使ってきたのでこのzshの挙動が許せないという向きには、setopt no_multiosを.zshrcに書き込んでおくという選択肢も残されている。
| Microchip、Arduino互換のchipKIT Fubarino Mini boardなどを発表 [09:30 5/21] |
| Freescale、インテリジェントセンサハブ「Xtrinsic」の新製品を発表 [09:00 5/21] |
| Bradcom、組み込み向け無線接続ソリューション開発キットを発売 [08:30 5/21] |
| Infineon、650Vスーパージャンクション技術採用の次世代パワーMOSFETを発表 [08:00 5/21] |
| 深海底の熱水ヒントに“ナノ・エマルション”生成 [17:35 5/20] |
|
ラジオを聞く20代男性が増加! - 「2013年4月度首都圏ラジオ調査」 [09:42 5/21] ライフ |
|
鹿児島の銘柄鶏「桜島どり」を柚子こしょうで! ローソンの郷土おにぎり [09:39 5/21] ライフ |
|
セブン&アイ×東洋水産、ダシが利いたスープに生麺感覚の「金の麺」発売 [09:38 5/21] ライフ |
|
カシオ、150万枚の高耐久性を持った38枚/分の印刷が可能なページプリンタ [09:30 5/21] エンタープライズ |
|
九大と住友金属鉱山、レアメタル分離用の新規抽出剤を開発 [09:30 5/21] 開発・SE |