特集リ N ー X の基礎知識 0 図 10 kill-ring 変数の内容 ② This buffer is for notes you don 、し want し 0 save, and for Lisp evaluation. ③工 f vou want し 0 create a file, v 土 s 土む that file with C—x C—f, ① then enter the text in that file's own buffer . ①行頭で C ー k を 2 回実行 ②文字列 buffer を M-d でキル ③ C - w でリージョンをキル ① ~ ③を実行した直後の k Ⅲィ ing の内容 工 f you want し 0 create a f 土 1e ′ buffer then enter the text in that fiIe ー s own buffer . \n し、エコーエリアで、、 kill-ring" と入力すれば見ることが できます。 40 は、すべてのバッフアやフレームで共通のものカイ吏われま なお、キルリングは 1 つの Emacs のプロセスであれ たときと変わっていないはすです。 ングの内容そのものは最初に、、 C-h v kill-ring" を実行し で移動するのはキルリングのポインタだけなので、キルリ で再度、、 C-h v kill-ring" を実行してみてください。 M-y びカーソル位置にペーストされます。ためしに、この状態 入力すると、最後に M-y て置き換わった文字列がふたた す。適当なところで M ー y の入力をやめ、代わりに c-y を リングの末尾の ( もっとも新しい ) 文字列に置き換わりま 文字列 ) に到達しますが、さらに M-y を入力するとキル M-y を入力し続けるとキルリングの先頭 ( もっとも旧い に格納されている旧い文字列に置き換えられていきます。 すると、 C-y によって挿入された文字列が、キルリング ate a file,) か師入されます。続けて M-y を何回か入力 キルリングのもっとも新しい文字列 ()f you want to cre- 態で適当な場所にカーソルを移動し、 c-y と入力すると、 要素に相当し、それらカ噺しい順に並んでいます。この状 二重引用符で悃まれた各文字列がキルリングの酉冽の各 enter the text in that file's own buffer . \n") ("lf you want to create a file," "buffer" "then kill—ring's value is 表示されます。 フアが 2 つに分割さ下のバッフアに次のような値が さきはどの状態で kill-ring の値を表示させると、バッ で変数名を入力します。 は、、 C-h v " または、 M-x help v " と入力し、エコーエリア kill-ring に限らす、 Emacs の変数の値を参照したいとき す。したがって、 2 つのファイルを異なるバッフアで開 いている状態で、一方のバッフアでキル ( または、、 M-w" でコピー ) した文字列を、もう一方のバッフアにペースト することができます。 その他の編集コマンドについては、カーソル移動のコマ ンドと同様、 tcsh や bash を使っている人なら直感的に 理解できると思います。こまでに紹介したものを含め、 おもな編集コマンドを表 2 にまとめておきます。 なお、初其用大態の Emacs では、 C-n でカーソルをバッ フアの下方に動かしていくと、バッフアの最終行に到達 してもどんどん移動し、それにつれてバッフアの行数も 増えていってしまいます。また、とくに設定していなけれ ば、、℃ - h " は help-command に割り当てられているの で、 bash や tcsh で C-h を BS (Backspace) キーと同 し意味で使っている場合はひどく使いづらいと感しるかも しれません。これらの設定変更については、最後の「カス タマイズ」の節でまとめて紹介します。 文字列の検索については、表 3 に示す 8 つのコマンドが あります ( それぞれ、前方 ( バッフアの末尾への ) 検索と 後方 ( バッフアの : 麪費、、の ) 検索の組になっているので、 実質的には 4 不頁です ) 。 以ード、順番に説明します。 インクリメンタル・サーチ 検索コマンドのうち、もっとも頻繁に使うのがインクリ メンタル・サーチです。このコマンドでは、検索文字列を 1 文字でも入力すれば検索が開始されます。さらに 2 文 字、 3 文字、 ・・と検索文字列を増やしていくと、それに 応してマッチする場所も移動します。 文字列の検索 UNIX MAGAZINE 2001.10
連載 す。しかし、 シェルの魔術ー 0 コマンドの実行結果を既存のファイルに追 加したい場合もありますれこんなときのために、シェル には、、追加の出力リダイレクション " という機能がありま す。これは、次のかたちて硬います。 > " が 2 新規の出力リダイレクションの場合と異なり、 > > file file_ni_tsuika sude-ni-file—ga—aru—baai $ cat testl . txt $ echo file—ni—tsuika > > sude—ni—file—ga—aru—baai $ cat testl . txt みましよう。 つになっています。さっそく、」助日できるかどうか試して testl . txt たしかに追加されていますれ UNIX MAGAZINE 2001.10 ンは次のかたちてイ吏います。 閉してしまうことができます。閉しる出力リダイレクショ は、、、閉しる出力リダイレクション " を使って標準出力を 報は知らなくてもいいという場合です。このようなときに イルやインストールをしていて、その進捗状況に関する情 いこともあります。たとえは、アプリケーションのコンパ 場合によっては、コマンドの実行結果がまったく必要な 閉じる出力リダイレクション という動作をします。 2. 存在しない場合はファイルを新規に作成する 1. 存在する場合はそのファイルに追加し したファイルか有在するかどうかによって、 以のように、追加のリダイレクションは出力先に指定 カ噺しく生成さ実行結果が出力されました。 新規のリダイレクションのときと同しように、ファイル sonzal_senu_file_ni_tsuika $ cat test2. txt link . 1 link . 2 testl . txt test2. txt $ ls $ echO sonzai—senu—file—ni—tsuika > > test2. txt はどうなるのでしようか。 それでは、出力先に指定したファイルか存在しない場合 閉じるだけなので、ファイルを指定する必要はありませ ん。実際にやってみましよう。 $ ls testl . txt test2. txt li Ⅱ k .2 1i Ⅱ k . 1 $ echO tOj iru—redirection > & ー $ ls link . 1 $ ls li Ⅱ k . 1 link . 2 1 土Ⅱ k . 2 testl . txt test2. txt testl . txt test2. txt このように、何も表示されません。また、新しいファイ ルもできていません 漏れてる ? 出力リダイレクションをいろいろ試していると、たまに 不思議なことカ起こります。 たとえば、 testl. txt と test2. txt の内容をくつつけて log. txt に出力することを考えましよう。このためには、 次のようなコマンドを実行します。 $ cat testl . txt test2. txt > 10g. txt ところが、 cat の引数を間違ってしまうと・・ $ cat testl . txt test3. txt > 10g. txt cat : test3. txt : NO such fi1e 0 て directory $ cat 10g. txt sude—ni—file—ga—aru—baai file_ni—tsuika test2. txt を間違って test3. txt としたため、「そんなフ ァイルあらへんで」と怒られています・・・・・・が、おや ? ちゃ んと出力リダイレクションをしているにもかかわらず、 のエラーメッセージは端末に表示されています。 log. txt には testl. txt の内容がそのまま出力されていますれ 出力リダイレクションなしでこのコマンドを実行してみ ると、次のようになります。 $ cat testl . txt test3. txt sude—ni—file—ga—aru—baai file_ni—tsuika cat : test3. txt : NO such fi1e 0 て directory 111
特集 UN ー X の基礎知識 0 図 1 Emacs 刀期 e F 日時一 Edit 第Ⅱ椥ゆ ユ肥 to Ⅲゖ ョ menu bar 証 8r0 Ⅱ bar are sufficient for basic it 場 with tl-e . ÅJ.gefu1 Fi1es menu items: 囹印れ acs - Ⅲー 2070 ree わ sd 図 2 Files メニュー 回 emacs-dI-20.7@freebsd ー = &lffers F 日 Tm Edit ーー物ゆ Exit し s Recov 釭 Session ()r tYE Contr01-x f0110 d bY Cont で 0 ト c ) で 80V 釭 fi-les リ肥 editing 2f0 工 e a crash & に Tutor ・ レ矼 n ー by ー do 士加ⅱ記 for ・ : s efficiently. 犯第 C83 with A OL 町 EL 〕 ー (Non)Warranty ÉCOPYi-ng 1ti02 CoMitions for redistributing ⅵ c ト i 新 s. Versi0L3 to obtain th3 latest version of 団ー s. Ⅲ s 20.7.1 (iß—freebsi, X tmlkit) of Thu Apr 19 2001 on g 計劇 117. freebsd. org Copyrizht ⑥ 139 Free Software FouMation, læ. ・訂は 0 加旧 t10n atout びに日北 Pr Ct 団 1 「大文字の C のキーと小文字の x のキー押して、そいで C と c も押すんやな。で、括弧を入力して・・・・・・」 という人がいないともかぎらないので、以下で使うキー操 肥 rn 」 items: ( L ユ 3 朝 t 主す 10 朝一 LI ー A11 ~ 作の表記について説明しておきましよう。 CtrI キーと Meta キーを頻繁に使うので、よく憶えてお ちょっとややこしいかもしれませんが、 Emacs では という愈未です。 キーを押し、続いて Ctrl キーとキーんを同時に押す " を同時に押しながらキーん e リを押す " 、あるいは、、 ESC ています ) 。また、 M-C-key は、、 Meta キーと Ctrl キー ()C では、一殳に Meta キーは Alt キーに割り当てられ 、、 ESC キーを押してからキーんを押す " という意味です は、、 Meta キーを押しながらキーん e を押す " 、あるいは このはかに、 M-key というキー操作もあります。これ おこなうことによってそのコマンドか夫行されます。 す。 Emacs では、コマンドに割り当てられたキー操作を ているのは、このキー操作によって実行されるコマンドで を押す " という操作になります。その次の括弧内に書かれ しながら x キーを押し、続いて CtrI キーを押しながら c す " という意味です。つまり、上の例は、、 CtrI キーを押 ます、 C ーんは、℃ trl キーを押しながらキーん e を押 34 としたのと同じことになります。 M—X save—buffers—kill—emacs コマンドを実行することができます。つまり、上の例は、 、 M-x 括弧内に書いたコマンド名 " と入力すると、その いてください。 TI ・碑 1 File- If Diru:tory then ! Mfer . 号をけ } れ は FiIe. KilI 日雅 &lffer E}{ it 朝 価を Wirmg 響ⅱ山 0 ロ 0 Di ー・ ー 0 Frave (C-x C-O n t (C-x の iSit 付・ツ e S 0 (C-x C-O) C-x i) (C-x C-c) (C-x の 付・ツ (C-x 5 の X 環竟であれば、 Emacs のウインドウ上部に表示され るメニューを用いて終了させることもできます。、、 Files" をクリックすると、図 2 のようなプルダウン・メニュー か表示されます。ここで、一番下の、、 Exit Emacs" をマ ウスで〕尺すると Emacs カ鮗了します。 Emacs でのイ乍業を一日判勺に中断したいときは、、℃ - z " を入力します。このキーは、 Emacs を X のウインドウと して実行しているのか、端末内で実行しているかによって 扱いが異なります。ウインドウとして実行している場合、 C-z は iconify-or-deiconify-frame というコマンドに割 り当てられており、そのフレームがアイコン化された状態 になります ( アイコン上で C ー z と入力すると、フレームが ふたたび開きます ) 。一方、端末内で起動している場合に は suspend-emacs というコマンドに割り当てられてお り、 Emacs が一印芋停止の状態になります。 ウインドウの構成 操作去を説明する前に、 Emacs のウインドウ構成を みておきましよう。 Emacs は、以下の、、部品 " から構成 されています ( 図 3 ) 。 / ヾッファ ファイルなどを編集するための作業領域です。メール リーダーなどのプログラムを起動している場合は、メッ セージリストや内容などが表示されることもあります。 必要に応して、バッフアを縦方向や横方向に分割し、そ れぞれのバッフアで異なる内容を表示することも可能で す。複数のバッフアか表示されている場合、編集など の操作をおこなっているバッフアのことをカレントパッ UNIX MAGAZINE 2001.10
find-file や find-file-read-only では新たなバッフアに 売み込んだファイルか変更 - 可能かどうかは、バッフアの ファイルを読み込みましたが、、、 C-x i" (insert-file) を モードラインを見れば分かります。書込み可能なファイル 実行すると、指定したファイルの内容がカレントバッファ を find-file で読み込むと、モードラインの左端の部分が のカーソル位置の直前に挿入されます。 . emacs 一方、編集したバッフアの内容をファイルに保存する と変わります ( ファイルの文字コードによって、 J が E や には、、℃ー x c-s" (save-buffer) あるいは SSC-x C-w' S になっている場合もあります ) 。翫み込んだバッフアに (write-buffer) を実行します。前者はバッフアに表示さ なんらかの変更を加えると、 れているファイル名のファイルに保存しようとし、後者は 異なるファイル名で保存しようとします ( 工コーエリアで —J:** . emacs ファイル名の入力を促されます ) 。ふだんは save-buffer のように * * マークが付き、変更されたことを示します。 を使うことが多いと思いますが、変更した内容を別のファ 一方、書込み不可のファイル、あるいは書込み可能で イルに保存したいときなどは、 write-buffer を利用しま あっても find-file-read-only で言売み込んだファイルの場 しよう。 合は、モードラインが、 ld ー file で存在しないファイルを開こうとすると、その ファイルはないにもかかわらす、指定した名前のバッファ -J:%% . emacs が開きます。ただし、この点ではファイルはまだ作成さ となります。この状態でバッフアに変更を加えようとす れていません。最初に save-buffer を実行した時点で、指 ると、エコーエリアに「このバッフアには書き込めへんで 定したファイルカイ乍成されます。このガ去は、新たにファ (Buffer is read-only) 」というエラーメッセージか表示 イルを作成するときに使えます。 されます。 バッフアの書込み制限を解除するには、ファイルを読 find-file でファイル名を入力している途中で気か変わった み込んだあとで、、 C-x c-q" (vc-toggle-read-only) を実 ときなどは、、 c-g" (keyboard-quit) でコマンド ( この場合 行します。 toggle ( トグル ) とあるように、このコマンド は find-file) の実行を取り消すことができます。 C-g は、実行 を実行するたびに書込み禁止と解除が入れ替わります。 しようとしている、あるいは実行中のコマンドを取り消すとき に便利なので、ぜひ憶えておきましよう。 厳密には vc-toggle-read-only は、、バッフアに対する 物ムみ制限 " であり、ファイルへの書込みを制御するわけ さきほどの図 1 をもう一度見てください。これは引数 ではありません。たとえは、パーミッションを書込み不可 を指定せすに Emacs を起動したときのデフォルトの画面 に設定した . emacs. OLD というファイルを find-file で読 で、、、 *scratch*" という名前の特殊なバッフアです。しは み込んだとします。このとき、 vc-toggle-read-only を実 らく放っておくか、あるいは何かキーを押すと、バッファ 行すると、そのバッフアに対して変更を加えることはでき の内容は図 3 のように変化します。このバッフアはユー ます。しかし、保存しようとすると、エコーエリアに、 サーが自由に編集できますが、 This buffer is for notes you don't want tO Fi1e . emacs. OLD is write¯protected; - try t0 save anyway? (yes or Ⅱ 0 ) ロ save , and for Lisp evaluation. If you want tO create a fi1e , visit that fi1e という警告メッセージか表示さオ L 、どうしても保存するか with C—X C—f , then enter the text in that fi1e ' s own buffer. と訊かれます ( 誌面の都合ー E 、て折り返しています。以 というコメントからも分かるように、保存する必喫のない ノションを ー祠枷ここで yes " と入力すると、パーミ、、 ( あるいは保存したくない ) メモ書きや、 Elisp プログラ 無視してファイルに変更か反映されます ( もちろん、これ ムの評価に使うためのものです。したがって、新たにファ はそのファイルの所有者が自分の場合です。他人のファイ イルを作成したい場合は、面倒でも find-file を実行して ルについて同様の操作をすると、書込みはできないといわ 編集したほうがいいでしよう。 れます ) 。 二 = ロ 37 UNIX MAGAZINE 2001.10
連載 / シェルの魔術ー 0 順番を逆にしてみると・・ 図 6 同じ窓口 図 5 標準出力と標準工ラー 0 1 2 2 1 0 ファイ丿レ 端末 端末 入力 出力 ・ - 複製 - 、 末 端準カ 標出 端準カ 垣人 末 端準カ 標出 端準カ 標入 期状態 期状叫 商示 2 > & 1 まで解釈 ー複製 - 、 末 端準カ 標出 端準カ 標入 まで解 * > & 1 まで解 $ cat testl . txt test3. txt 2 > & 1 > logerr. txt 体を指し示しているように ードリンクの仕組みを思い cat : test3. txt : NO such file or directory 出してください ) 、複数のファイル・ディスクリプタが 1 $ cat logerr. txt つの窓口を指し示すようにするわけです。これを、ファイ sude—ni-file—ga—aru—baai file_ni_tsuika ル・ティスクリプタの複製といいます。ファイル・ディ $ ロ スクリプタを複製するには、以下のようにします。 このように、標準出力だけカワァイルに出力さ標準 [ れ幻 > & れ 2 工ラーは端末に出力されてしまいました。この理由は図 6 を見れば分かるでしよう。標準出力をファイルに向ける前 とれ 2 はファイル・ディスクリプタで、れ 2 て示さ に標準工ラーへ複製してしまったため、標準工ラーは端末 れる箱の中身をに複製します 5 。また、は省略する に向いたままになったのです。 ことができます。省略した場合は、標準出力、つまり 1 が 指定されたことになります。 標準入力とリダイレクト それでは、やってみましよう。 標準入力 $ cat testl . txt test3. txt > logerr. txt 2 > & 1 $ cat logerr. txt コマンドのなかには、実行中になんらかの入力を求める sude—ni—file—ga—aru—baai ものがあります。このとき、入力を取り込む、もと " を標 file_ni_tsuika cat : test3. txt : NO such fi1e or directory 準入力と呼びます。ファイル・ディスクリプタの説明で こっそり出てきていますが、 0 番が、、標準入力箱 " を表す 今度は、ちゃんと標準出力と標準ェラーが 1 つのファイ 記子てす。 ルに出力されました。このときの様子を図 5 に示します。 標準入力のリダイレクション ます、標準出力をファイルに向けます。ここまでは図 4 の 標準入力をリダイレクションして、ファイルから読み取 場合と同しですね。次に、標準ェラーを標準出力カ甘旨し示 ることもできます。これは、次のかたちで使います。 している窓口に向けなおしています。 ところで、、、 > logerr. txt" と、、 2 > & 1 " には順番があ ります。順番を逆にして実行してみましよう。 5 実際には複製しているわけではなく、、共有している " という感しです。 イ ′、ラ ′イ ア準カ フ標出 端準カ 標入 末 ア準カ 標出 端末 > 第んまで解 標準 入力 く file もちろん、ファイル・ディスクリプタを明示的に指定 して、、 0 く " と書くこともできます。 114 UNIX MAGAZINE 2001.10
連載 / シェルの魔術ー 0 別々の窓口 図 4 標準出力と標準工ラー にはプロセスが、、外の世界の何か " と通信するための、、志 ロ " が入っていると考えたはうがより正確てす。たとえば、 端末やファイル、ネットワーク上のほかのホストなどは、 プロセスからみると、、タ ) 世界の何か " です。したがって、 これらのものに対する入出力 ( 通信 ) は、すべてこの窓口 を通しておこなわれるのです。 2 の正体に話を戻しましよう。この数字は、、、箱 " を識 男けるための言当主子です。この言当子はファイル・ディス クリプタと呼はれます。そして、ファイル・ディスクリ プタのうち、 0 ~ 2 は以下のように予約されています。 0 標準入力 1 標準出力 つまり、この、、 2 " という数字は、、標準ェラー箱 " を表す ファイル・ディスクリプタなのです。、、 2 > e " は「標準 工ラー箱 ( 2 ) に川 e への窓口を入れる」といナ未だった のですね。 ー麹勺に、リダイレクションの書式は以下のようになり ます。 司几市ル叩 file れはファイル・ディスクリプタで、几市ル叩はリダイ レクションの不鶤頁を表す記号です。 file は出力先を表します。これは、閉しる出力リダイレ クションのように、市 7 、叩によっては不要なこともあ ります。 「ほな、標準出力箱は 1 番なんやから、標準出力のリダイ レクションは、、 1 > " になるんとちゃうの ? 」 上の一般形に従うと、標準出力のリダイレクションは 、 1 > " となります。実際に、このかたちて驃準出力をリダ イレクトすることもできます。、、 > " は、、 1 > " からファイ ル・ディスクリプタを省略した特別な書き方だったわけ です。、、 > > " や、、 > & ー " についても同様です。 2 1 0 端準カ 標出 端準カ 垣人 初期状叫 .- 別もの、、 ファイルファイル 端末 標準 標準 標準 入力 出力 工ラー > ルまで解釈。 file_ni_tsuika $ cat err . txt cat : test3. txt : NO such file or directory この例では、標準出力を log. txt へ標準ェラーを err. txt へと、別々のファイルにリダイレクトしています。 それでは、標準出力と標準工ラーを同しファイルにリ ダイレクトするにはどうすればいいのでしようか。すぐ思 いっくのは、出力先に同しファイル名を指定することです ね。 $ cat testl . txt test3. txt > 10g. txt 2 > 10g ・ txt $ cat 10g. txt cat : test3. txt : NO such file or directory おや、標準工ラーはファイルに出力されましたが、標 準出力のほうは消えてしまいました。これではだめなよう です。 さきほど、ファイルへの入出力は窓口を通しておこなわ れると説明しました。上記のリダイレクションでは、標準 出力への窓口と標準ェラーへの窓口が別々に生成さそ れぞれの箱に入れられます ( 図 4 ) 。ところが、この窓口は 出力先か 1 司ーのファイルになっています。このため、 1 っ のファイルに別々の窓口から出力されることになり、ファ イルの内容がおかしくなったのです。 同しファイルに正しく出力するためには、標準出力箱と 標準ェラー箱に入れる窓口を同しものにする必要がありま す。ちょうど、複数のファイル名が 1 つのファイルの実 標準出力と標準工ラー 標準出力のリダイレクションと標準工ラーのリダイレク ションは、同時に使うこともできます。 $ cat testl. txt test3. txt > 10g. txt 2 > err . txt $ cat 10g. txt sude—ni—file—ga—aru—baai 113 UNIX MAGAZINE 2001.10
私の竟は Celeron 433MHz に 8.4GB のディスク、そ して 56Kbps のモデムによる PPP 接続だった ) 。した がって、 1 曲で数 MB にもなる音声ファイルば宿しな けれは扱いようがなかったのである。ところが、現在では CPU が 1GHz 以 . 上でディスクか凄十 GB のマシン、そ して ADSL や CATV を経由した高速な接続か普通にな りつつある。以前とくらべると、ディスクも接続速度も 10 倍以上になっているのだから、わざわざ 10 分の 1 や 20 分の 1 に不可 j して音質を落とす必要はないとさえい える。 とはいっても、それはあくまで音質を考えた場合の話 で、やはりファイルサイズは小さいに越したことはない。 いくら回辛勦ゞ太くなったからといって、生の PCM データ を送ろうとする人ははとんどいないだろう。逆にいえば、 多くの人は音声ファイルの品質に満足しているという ことであり、高速な接続に慣れてしまうと後戻りできない ということでもある。 vorbis-tools のインストール さきほども触れたように、 Vorbis は Windows や Mac OS などにも対応しているが、最新版は Linux で試すの がよいようだ。とくに Red Hat 系の Linux であれば、 RPM パッケージが用意されているので、インストールも 簡単である。あるいは、 CVS を使って最新のソースコー ドを入手し、コンパイルしてもいいだろう。 ・ Vorbis の RPM ノヾッケージ http://www.vorbis.com ・ CVS で最斤のソースをチェック http://www.xiph.org/ogg/vorbis/ Linux で Vorbis を利用する場合は、アプリケーション のほかにライプラリも必要になる。旧バージョンの Vor- bis をインストールしてあるのなら、まずライプラリ類を 最新のものにアップデートし、その後に vorbis-tools を インストールする。 vorbis-tools には、 oggenc ( 工ンコー タ ) 、。 gg123 ( デコー夘、 ogginfo ( ファイル情報の表示 ツール ) が含まれている。 私は、 ・ libao -0.8.0-1. i386. rpm ・ libogg ー 1.0rc2-1. i386. rpm et's PIay with UNIX ⑩ UNIX MAGAZINE 2001.10 図 5 、 Vindows 用工ンコータ Ogg Drop Drop Files Here このアイコン上に WAVE ファイルをドラッグ & ド ロッフするだけでエンコードしてくれるお丁軽なアプリ この魚がぐるぐる回転 Password : $ su トールした。 の 4 つの RPM パッケージを入手し、次のようにインス ・ vorbis-tools-l. 0rC2ー1. i386. rpm ・ libvorbis-l. 0rC2ー1. i386. rpm する。 ケーション。工ンコード中は、 E1apsed time : 4m 03.7s Fi1e length: 3m 20. Os Done encoding file "cdda ・ ogg Encoding " cdda ・ ogg" [ 100.0 % ] [ 0m00S remaining] Opening with wav module : WAV file reader $ oggenc cdda. wav ルが出力される。 と、拡張子が、、 . wav " から、、・。 gg " に置き換わったファイ からリッピングした WAVE ファイルをエンコードする ットレート 128Kbps でエンコードする。たとえば、 CD の WAVE や AIFF ファイルのソースを、ターゲット・ヒ、 oggenc は、デフォルトでは 44. lkHz / 16bit / ステレオ oggenc tools ー 1.0rc2 ー 1. i386. rpm を最後にしないと失敗する。 これらのパッケージには依存関係があるので、 vorbis- vorbis—tools—l . 0 て c2 ー 1 . i386. rpm # rpm —Uvh 1 土 bao ー 0.8.0 ー 1 . i386. て pm \ Rat e : 0 .8248 Average bitrate: 123.0 kb/s 3 分 20 秒の曲を 4 分 3 秒 7 でエンコードするのは、 等イ部まであともう一歩でちょっと残念である。もっと も、このときに使ったのは K6-2 4()0MHz という遅いマ シンだから、蜷丘のマシンならもっと高速にエンコードで きるだろう。等倍速以、 - ヒならストリーミング・ラジオの生 放送にも使えるから、この差は大きい。工ンコードに時間 がかかったので今回は試していないが、 oggenc にはもち ろん生の PCM ストリームをエンコードするオプション もある。 157
()f co れ市 0 れ t ん e れ一ル " れ eなeー和7 、 ms) c 。祠ⅲ。れで指定した変数や式などを謝面し、結果か真 であれは then-form を、偽であれば eなe如7 ・ ms ( 省略可 ) を実行します。 then-form には 1 つの命令しか書けない ので、複数の命令を実行したいときは progn 命令と組み 合わせます。 ()f window—system (progn (set¯background¯color "navy" ) (set—foreground—color "white" ) (set—cursor—color (set—mouse—color ” yellow " ) この例では、 window-system という変数の値を評価 し、結果か真であれば色の設定をおこなっています (else- forms はありません ) 。この変数には、 Emacs を X のウィ ンドウとして起動した場合には、、 x " 、端末内て起動した場 合には、、 nil " が自第勺に代入されるため、このような使い 分けが可能になります。 一方、 cond 命令は以下のように書きます。 ( c ond ( co れ市 0 れノルれ s ノ ) ( co れ市 t れ 2 ルロれ s2 ) (t 7 、 ms ) ・・を順に詔面し、結果が co れ d 笏 0 れム co d れ乞 0 れ 2 、 ・・・を実行しま 真であれば対応する fomsk forms2 、 す ( それ以降の c 。れ市。れは評価されません ) 。どの con- 市。れにもあてはまらない場合の、、落ち穂拾い " として、 最後に c 。れ市。れが、、 t " である文を書いておくこともで きます ( もちろん省略してもかまいません ) 。 たとえば、複数のシステムがあり、それぞれ NEmacs 、 Mule 、 XEmacs 、 Emacs のいすれかがインストールさ れている場合、 Emacs の不鶤頁に応じた成疋ファイルを読 み込みたいのなら、 ~/. emacs に次のように書けばいいで しよう。 ( c ond ( (boundp 'NEMACS) (load (expand—file—name " ~ /. nemacs. el " ) ) ) ( (boundp 'MULE) (load (expand—file-name "~/. mule. el") ) ) ( (string¯match emacs¯version) UNIX MAGAZINE 2001.10 (load (expand—file-name ”~/. xemacs. el")) ) ((string—match " 20.7 " emacs¯version) (load (expand—file—name ” ~ /. emacs20. el") ) ) expand-file-name 命令は、 ~ / をホーム・ディレク トリの糸寸パスに展開するために使っています。 boundp は、変数が定義されているかどうかを調べる 命令です。 NEmacs や Mule であれば、変数 NEMACS または MULE がセットされているかどうかで判断できま す。また、 XEmacs であれは畯数 emacs-version の値に 、、 XEmacs" という文字列が含まれています。 Emacs の場 合けくなくともバージョン 20 以降 ) 、 emacs-version の 値はバージョン番号だけのようです。 . emacs のサンプル 図 20 は、私カ硬っている ~ /. emacs をかなり整理した ・ " 以降はコメントとみなされ ものです (. emacs では、 ます ) 。詳細は参考文献などに譲るとして、各部分のおお まかな懣未は以下のとおりです。 言語と漢字コードの設定 ( 1 ~ 3 行目 ) Emacs で使う言語環境と表示用の漢字コードを設定し ています。複数のユーサーが共用する場合には、このよ うな設定はシステム共通の設定ファイルでおこなうべき でしよう。 ・かんなの起動 ( 5 ~ 8 行目 ) かな漢字変換サーバーを localhost に指定し、かんな のパッケージを読み込んでから、かんなを起動してい ます。なお、変数 canna-server で指定したサーバー は、竟変数 CANNAHOST よりも優先されます。 ・フォントの設定 ( 10 ~ 19 行目 ) Emacs をウインドウとして起動している場合、 Shift 十 マウスの左ボタンで、画面表示に使うフォントの不頁を 変更することができます。 バイナリ・パッケージがきちんと作ってあれは、日本 語フォントで悩むことはあまりないでしようが、私の 環境ではデフォルトのフォントの 16 ドットでは大き すぎ 11 、 14 ドットのフォントには気に入ったものが使 われていなかったので、半角 ASCII と日本語のフォン トを自分の好みのものに変更しています。 11 ディスプレイの解像度が 1 , 024 x 768 なので、 16 ドットのフォン トにすると Emacs の画面が大きくなりすぎるのてす。 55
連載 / シェルの魔術ー 0 file_ni_tsuika $ cat く sude Ⅱ 1 ー testl . txt file—ga—aru-baai また、あまり使い途はありませんが、次のようにする [ れ幻く & れ 2 [ れ幻く & ー と、閉しるリダイレクションや複製もおこなえます。 入力、つまり 0 カ甘旨定されたことになります。 ともには省略することが可能です。省田芋は、標準 です。 入力に与えられるべき文字列を、茁旨定するためのもの ばれるものがあります。これは、実行するコマンドの標準 リダイレクションの 1 つに ヒア・ドキュメント ヒア・ドキュメントと呼 ます。デリミタはどのような文字列でもかまいません。実 ます。 d m はたんなる区切りで、デリミタと呼ばれ ている場合は、そのファイル・ディスクリプタ ) べ度され 売〃 m ・に囲まれた文字列は標準入力 ( れカ甘旨定され de m e ん e - doc - .. 下のように使います。 ヒア・ドキュメントの書式はすこし変わっていて、以 here—document no test > kugiri > here—document Ⅱ 0 test $ cat くく kugiri 際にやってみましよう。 UNIX MAGAZINE 2001.10 場合は、デリミタの前にもタブを入れてかまいません。 あるタブをすべて取り除く、という意味になります。この くく " の直彳変に ーを続けると、そオ・助、降の各行の頁に れています。 入力中は、そのことを示す、、 > " というプロンプトか表示さ ています。また、コマンドの標準入力べ度される文字列の この例では、デリミタに、、 kugiri" という文字列を使っ $ cat くく一 kugiri > ( タブ ) here—document no test > ( タブ ) kugiri here—document Ⅱ 0 test シェル・スクリプトのなかでヒア・ドキュメントを使 うときにこの機能を用いると、コマンドに渡す文字列をイ ンデントできるので、見やすくなってイリです。 ヒア・ドキュメントには、もう 1 つイ甦リな機能があり ます。 $ cat くく kugiri testl . txt Ⅱ 0 nakami > 'cat testl . txt' > kugiri testl . txt Ⅱ 0 nakami sude—ni—file—ga—aru—baai file_ni_tsuika はバッククオートと呼ばれます。コマンド行では、バ ッククオートて悃まれた部分をさきに実行し、その結果で 置き換える、という意味をもちます 6 。 ヒア・ドキュメントでは、コマンドに渡す文字列中の バッククオートを解釈し、そのコマンドの実行結果に置換 します。はかに、パラメータ置換 7 もおこなわれます。 一方、デリミタの地頁に、、 \ " カ咐いている場合、もしく はデリミタが、、 ' " または、、” " で囲まれている場合 8 は、コ マンド置換とパラメータ置換はおこなわれません。 testl . txt Ⅱ 0 nakami > kugiri cat testl . txt ( testl . txt Ⅱ 0 nakami cat くく 'kugiri' ンについて説明しました。次回は、複数のコマンドをつな 今回は、コマンドの入出力を切り替えるリダイレクショ ccat testl . txt' 6 これをコマンド新奐といいます。詳しくはあらためて説明します。 ( もりしま・なおと奈良先端科 ! 物支彳大判完大学 ) ぐ、、パイプ " を紹介する予定です。 これを、デリミタカ引用されているといいます。 7 これもいすれ・・・ 8 115
連載 / シェルの魔術ー 0 図 3 標準出力と標準工ラー シェ丿レ 端末 標準 出力 端末 標準 工ラー 起動 変更 引継ぎ コマンド ファイル 標準 出力 端末 標準 実行結果は、エラーメッセージを含めて 3 行です。出 カリダイレクションをしたとき、この 3 行が log. txt に 出力されるはすなのに、実際には最後の行だけ端末に表示 されています。この行だけ、出力リダイレクションから漏 れてしまったのでしようか ? この謎の答は、次に説明する、、標準工ラー " にありま す。 標準工ラー 標準工ラーとリダイレクト ます。一方、処理中に発生したエラーを表すメッセージは 読み込み、それを標準出力 ( ここでは log. txt) に表示し cat(l) は、引数に指定されたファイルの内容を順番に ら、、端末 " を引き継ぎます ( 図 3 ) 。 おりです。それに対し、標準工ラー箱はそのままシェルか す。これは、出力リダイレクションのところで説明したと マンドの標準出力箱に "log. txt" というファイルを入れま シェルがコマンドを起動するとき、、、 > " を発見して、コ $ ロ cat : test3. txt : No such fi1e or directory $ cat testl . txt test3. txt > 10g. txt さて、前節の謎を解明しましよう。 端末になります。 ラーは端末なので、コマンドの、、標準ェラー箱 " の中身も 動したシェルから受け継がれます。通常、シェルの標準ェ す。標準出力の場合と同様に、標準ェラーもコマンドを起 これは標準工ラーと呼ば、、標準出力箱 " とは別の箱で ラーメッセージの出力先を指定するための箱もあります。 結果の出力先が入った箱を標準出力と呼びましたが、ェ 標準ェラーに出力されます。 112 こでは、 test3. txt という 存しないファイルカ甘旨定されたため、標準ェラー ( = 端 末 ) に、 cat : test3. txt : NO such fi1e or directory 頭に 2 をくつつけたかたちで使います。 レクションは、次のように標準出力のリダイレクションの か。大丈夫、もちろんできます。標售ェラーの出力リダイ メッセージをリダイレクトすることはできないのでしよう それでは、標準ェラー箱の中身を入れ替えて、エラー 標準工ラーの出力リタイレクション というエラーメッセージカ咄力された、というわけです。 ません。 このとき、 2 > file シェルは、標準ェラーの出力リダイレクションがコマン 2 と > のあいだに空白を入れてはいけ UNIX MAGAZINE 2001.10 を選ぶことができるのでしたれしかし実際には、この箱 てきました。そして、出力先として端末やファイルなど こまで、出力先を入れるための、、箱 " があると説明し 体、これは何を表しているのでしようか。 ところで、、、 2 > " の、、 2 " の正体、気になりませんか ? ファイル・ティスクリプタとリタイレクション 2 > > file に 2 を付けるだけです。 ンが使えます。いすれの場合も、標準出力との違いは、頭 ラーでも追加のリダイレクションや閉じるリダイレクショ もちろん、新規のリダイレクションだけでなく、標準工 果が、ファイルにエラーメッセージがそれぞれ出力されま さきはどの結果とは逆に、端末に cat コマンドの実行結 cat : test3. txt : NO such fi1e or directory $ cat err . txt file_ni_tsuika sude—ni—file—ga—aru—baai $ cat testl . txt test3. txt 2 > err . txt ラー箱に、、川 e " を入れて起動します。試してみましよう。 ド行にみつかると、オ剽售出力の場合と同しように、標準ェ