METAFONT の遊び方 白矧専生 〇台風レポーターはかわいそう 0 9 月の中旬、戦後則史上最大といわれた台風が日本列 島を窺うかまえをみせていました。その日、私は朝からテ レビにかしりついて台風関係のニュースを観ていました。 各放送局がどんなふうに台風を報道するのだろうと思っ て、チャンネルをいろいろと変えてみました。 天下の大放送局は、つつこむスキすら・与えません。それ にくらべて、民放はなかなか味わい深い放送でした。とく に、私はある若者レポーターのファンになってしまいま 「こちら、〇 x 港です。風か強くて息カ、きません。立っ ているのかやっとです」 なんと、このレポーターは息かできなくても声は出せる のです。波か高くなった、風雨か強まったと、ひととおり お決まりのレポートをしたあと、 「以 - ヒで Ox 港からのレポートを終ります」 と締めくくりに入りました。本当に立っているのがやっと という感しで、ひどく苦しそうでした。ところが、スタジ オにいる司会のおしさんは彼に向かって、 「ちょっと待ってください。波がだいぶん高くなってき ましたね」 と言うではありませんか。一刻も早く中継を終えたそうな レポーターの意向など、どこ吹く風といった顔で絶妙なっ っこみをみせるおしさんです。波カ皜くなったなんて、さ っき言ったやんか ! 見たら分かるやんか ! 若きレポーターはおじさんには表立って逆らえす、 UNIX MAGAZINE 1995.11 瞬ムッとしたあと、さっき言ったことを繰り返していま 台風で害を受けた方には申し訳ありませんが、たいへ んおもしろい番組をどうもありがとうございました。 0 変な数 0 今月は、けこしだけ ) 真面目に METAFONT を使う ための編知識とでもいいましようか、変数に使える名前 と代数式について説明します。 これまで一番たくさん使ってきた変数名は、 xl や zl な どのコントロール・ポイントを表すものでした。そのほか には、フォントの大きさをする em # やパス型の変数 p などがありました。 それでは、どういう文字列が変数に使えるのでしよう か。『 METRFONT ブック』 [ 1 ] には次のように書かれて います。 < 変数 > < サフィックス > < 添字 > → → → くタグ > < サフィックス > くエ > ー < サフィックス > < > ーくサフィックス > くタグ > < 題直トークン > は < 数値式 > ] 何やらややこしそうな式がずらすらと並んでいますが、 簡単にまとめると、変数名として使えるのは、、タグで始ま り、その後ろに数字とタグが並ぶ " 文字列です。タグは、 " ( ドット ) 、そして空白文字 ( スペー アルファベットと スとタフつからなります。変数名の途中にスペースを入れ るなんて、 C 言語に慣れている人にとってはちょっと気 持ち悪いですれ 直トークンでは、小点を含むこともできます。直 103
リスト 1 expr ・ mf mode—setup , string s ; tracmgonline : = 1 ・ forever : message s : =readstring; ShOW scantokens S ; endfor 表 1 METAFONT に用意されている変数の型 scrollmode ; gllllllle an expr : 文字列型 / ヾス型 ペン型 ピクチャー型 変彡型 ペア型 数奮陋豐 boolea れ string path pen picture transform pa1r numerxc 型か俵すもの 真 (true) カ (false) ASCII 文字列 ノヾス ペン先の形 ピクセルの / ヾターン 変杉処理 2 つの数値のペア 題直 式を大括弧 ( [ ] ) で囲むと、その計算結果を数値トーク ンとして用います。したがって、 xl . 5 と x [ 3 / 2 ] は同し 変数になります。 たとえば、 a だけのもの、 al のように数字が付くもの、 a2ps や fig2ps2tex のようにアノレファベットのあいだに 数字を挟んだものなど、いすれも変数名として使えます。 アルファベット間にある空白はドットに変換されます。 したがって、 A s c 工 I と A. s. c. 工 . 工は同し変数です。 数字の前にあるドットは小数点として扱われます。で すから、 N 。 . 1 と N 。 0.1 は同し変数になります。数字の 後ろにあるドットも小点として扱われるので、 N 。 2. と N 。 2.0 と N02 は同じ変数です。 x[l] [ 2 ] のような 2 次元酉冽の変数を、大手刮瓜を省略 、 xl 2 " のように 2 つの数字をス して参照する場合は、 ペースで区切って書き並べます。 a5b と a [ 2 + 3 ] b は同し変数ですが、 a5b と a 2 + 3 b は異なります。数値式が処理されるのは大括弧で括ったと きだけです。したがって、後者は a5b にはならす、 a2 に b の 3 倍を足したものという未になります。おなしみに なった expr. mf ( リスト 1) を使って試してみましよう。 This is METAFONT, C Version 2 .71 (/usr/local/lib/mf/inputs/expr. mf gimme an expr : a [ 2 + 3 ] b > > a5b gimme an expr : a 2 + 3 b > > 3b + a2 違いが分かったでしようか ? 次に、変数 k に 2 カ阡に入されているとします。このと き、 a [k] は a2 と同じですが、 a k は a. k と同じ変数で す ( a. 2 にはなりません ) 。添字に数字を使う変数を参照 する場合は、大括弧が省略できるのか否かに注意してくだ 数字から始まる文字列も変数のようにみえますが、そう ではありません。たとえば、 1024MB は乗算記号 x を省略 したもので、変数 MB を 1 , 024 倍するという未です。変 104 数は、かならすアルファベットから始まっていなければな らないのです。 変数におかしな名前を付けると、エラーメッセージの 出ないバグの原因になりかねません。変数名を付けるとき のコツは、おかしな名前は避ける " ことです。自分の子ど もに、、最曖 " という名前を付けたら、モアイみたいな顔に なって大きくなってグレてしまうかもしれません。変数に もおかしな名前を付けるとグレてしまい、思いどおりに動 いてくれなくなってしまうおそれがあります。変数名は、 できるかぎりオーソドックスな名前にしましよう。大キ刮瓜 を省略するときは、省略できることを石忍してからのはう か羅です。 変数の型 METRFONT プログラムで数値を代入するための変 数を使う場合、とくに変数宣言をする必要はありません。 M ETRFONT では、初めて使われた変数は数値型だと仮 定するからです。 新間外の型の変数を使うときは、あらかしめ変数の型 と名前を宣言しなければいけません。 METAFONT には、 数値型変数のはかに 7 つの型が用意されています俵 1 ) 。 変数旦言がおこなわれると、その変数名でそれまでに定義 された値はすべて初期化されます。たとえば、 path r, r[], を実行すると、以前に r 、 rl 、 r1s2 などの変数を使って いた場合、その内容か消えてしまいます。 さきほど変数旦言をしていない変数は数値型と仮定す と宣言しなければならない場合があるのでしようか。あり nUmerlC a; ると説明しました。それでは、わざわざ、 UNIX MAGAZINE 1995.11
連載 / IJN Ⅸ知恵袋ーの はかに ん励ーれ ame " という形式でも指定できます。 扣 6 ゴ田 me は、シェルか管理しているジョブ名です。表 1 て示したように、ジョブ名は補完規則ー j 、 -r 、一 2 で補完 できます。ただ、それらの補完規則で補完される文字列は ジョブ名のみなので、ジョブ名の直前に、、 % " を付けなけ ればなりません。そこで、次のように設定します。 $ compctl —j —p % kill $ compctl —j —P % fg $ compctl —z —P % bg これで、 kill コマンドと fg コマンドではすべてのジョ プが、 bg コマンドではサスペンド中のジョブがジョブ名 を使って補完できます。 条イ判寸き補完夫リ こまでで、かなり高度な補完規則か当できるように なりました。今度は、コマンド行の入力状態によって補 完刎甫を変化させる、条件付きの補完について説明しま す。 牛付き補完が必要なケースを考えてみます。多くの場 合、コマンドのオプション引数はオプションの不鶤頁を示す なんらかのプレフィックスを要求します。たとえば、プ リンタにデータを出力する lpr コマンドでは、 -p という プレフィックスでプリンタ名を指定できます。ですから、 lpr コマンドを入力中のコマンド行に一 p か現れたら、その 直後にはプリンタ名がくると推測できます。プリンタ名が くることがあらかしめ分かっているのなら、補完の一嚇甫と してプリンタ名を出したいと考えるのが自然です。このよ [ 補完規則 ] [-x 条件補完規則 [ [ 一条件補完規則 ] 条件付き補完規則・ ただし、 コマンド名 eompctl 条件付き補完規則 [ [ + 条件付き補完規則 ] うな牛付き補完は、次に示す書式で設定します。 UNIX MAGAZINE 1995 ユ 1 でした。ですから、酉曹リ変数 printers に自分がよく利用 -k" は、酉改」変数を補完刎甫として指定する補完規則 lpr $ compctl —x 's [-P] ) —k printers lpr コマンドを設疋してみます。 すから、具一列をみていくことにしましよう。さきほどの ちょっと複雑です。「案するより産むが易し」といいま するプリンタ名を代入しておけは、そのなかから補完でき ます。次に条件部分をみてみます。 s[-p] というのが一 k で指定した補完を惹き起こす条件です。条件 s [ s れの は、 s れ 9 が入力された状態を表します。つまり、 $ lpr のように -p の直後にカーソルがある状態を示していま す。この状態で補完をおこなえば、酉改一変数の要素から補 完↑嚇甫カ非られます。 別の例として、 kill コマンドをみてみます。 kill コマン ドは、引数に送信するシグナル名をとります。たとえは、 プロセス ID 256 にハングアップ・シグナル (SIGHUP) を送るためには、 $ kill —HUP 256 とします。 OS がサポートしているシグナルの一覧を知 るには、 kill コマンドを一 1 オプション付きで実行すれ はよいのですが、すでに zsh では配列変数 signals に kill ー 1 の結果生成されるシグナルの一覧が入っていま す。 BSD/OS 2.0.1 での配列変数 signals の例を示し ます。 $ echo $signals EXIT HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USRI USR2 ZERR DEBUG ですから、次のように設定します。 $ compctl —x 's ト ] ' —k signals ki11 これで、 ーの後ろにカーソルがあるときに補完を試み ると、配列変数 signals の要素甫として選ばれます。 しかし、これでは前節で設定したジョブ名の補完ができな くなってしまいます。そこで、複数の補完規則を設定して やります。 kill コマンドには、次のような補完規則を設定 するのがいいでしよう。 $ compctl -j -P % -x 's [ ー ] , -k signals -x の前に設定するのはデフォルトの補完規則で、 -x 以 後に設定されている牛付き補完規則にマッチしない場合 に呼び出されます。このとき、カーソルが、、一 " の後ろにあ るかどうかを調べあったら配列変数 signals から補完 候補を選び、なければ一 j -P % という補完規則が適用さ kill れます。 95
METAFONT の遊び方 9 表 2 直を対象とする演算子 ます。以前使った変数は、この命令を用いて期化できま endchar beginchar( ” B ” , 10pt#, 10pt#, 0 ) ; のなかで酒改」変数 m 国を使ったとしましよう。次に、 endchar beginchar( ” A ” , 10pt#, l()pt#, 0 ) ; す。たとえは、 のなかで同名の配列変数 m[i] を定義しようとすると、 重定義でエラーになります。 ! Redundant equation. く tO be read again> く * > m [ 1 ] = 1 ; 異なる変数名を使えば工ラーは回避できますが、 と旦言しておけばよいのです。 nUmerlC Ⅱ 1 ト、、 B " の定義の最初の部分で、 METRFONT と戦って勝利を収めるためには、 「逃げんなー、勝負せんかーい」 は逃げているだけです。 十 sqrt max(a,b, ・ ceiling round mod div abs 十十 十一十 Sind COSd dir mlog 工 mexp 冫子 % mf e xpr 意味 加算 除算 累乗 平方根 最大の数 最小の数 - 明て 切上げ 叫龠五入 剰余 除算 ( 整数 ) 糸寸値 ピタゴラスの和 ピタゴラスの差 サイン コサイン 指定された角度のべクトル 256 ln ェ / 256 0 代数式 これで フォン 0 this is metafont, c version 2 .71 (/usr/local/lib/mf/inputs/expr. mf gxmme an expr : sqrt 5 > > 2 .23607 、宿は、いまもっともトレンディな数字です。ふじさん ろくに 数の組がいくつかあり、そのなかでの最大の数と最小 の数を求めるのが max と min です。 floor 演算は、 その引数と等しいか、もしくはそれを超えない最大の整数 を求めます。数学の教科書ではは」と書かれています。 ceiling 演算は、その引数と等しいか、もしくはそれを超 える最小の整数を求めます。数学の教科書では「ⅵと書 かれています。たしか、は」が、、ガウス記号 " だったよう な記慮もありますが、はるカ嘴のことなので忘れてしまい METAFONT からフォントを生成する部分を取り除く と、、高機能電卓 " になります。咼機能とはいっても、けっ こうなどんぶり勘定をしてくれるので正確さは求められま せん ( どこか咼機能なんや ! ) 。 これは、 METRFONT が一」一を整数倍した値を用い 65535 て固定小魏点演算をしているからです。誤差だと思って、 笑ってすませましよう。わははははは 1 。 METAFONT が数値に対しておこなえる演算の不鶤頁を 表 2 に示します。 たとえば、ⅳを求めてみましよう。 1 本当はどの引算機でも同じ結果になるようにするためてす。 UNIX MAGAZINE 1995.11 ました。 g 1mme > > 10 g lmme > > 2 g llnme > > 2 glmme g 11D.me an an : max ( 2 , 5 , 10 ) : min ( 2 , 5 , 10 ) f100r 2 .2360679 f100r ー 2 .2360679 ceiling 2.2360679 expr : expr : 105
連載 / プログラマー入門ー⑩ 最後の、、オ剽純勺ではない竟変数 " についてはすこし説 明を加えましよう。 LANG 竟変数の設定を見て日本語と 英語を切り替えるプログラムを作ったとします。このプロ グラムは、おそらく次のようなルールて川乍します。 1. LANG か設定されていれば、設定された言語にする。 2. LANG が設定されていなければ、英語にする。 ところが、こオけごけでは間題カ起きるのはすでにお話し したとおりです。そこで、 man コマンド専用の新しい環 境変数 MAN-LANG を導入し、次のようなルールで日本語 と英言韶 ) 切替えをおこなうことにします。 1. MAN-LANG が設定されていれば、設定された言語にす る。 2. MAN-LANG か、設定されていなくて、 LANG か設定されて いれば、 LANG に設定された言語にする。 3. MAN-LANG も LANG も設定されていなけれは、英語に する。 るべくコマンド行オプションやサプコマンドで直孑旨定で らいにするかにもよるので一概には決められませんが、な 混乱させかねません。カスタマイズできる項目数をどのく 組みは、設定の優測立を複雑にし、ますますューサーを しかし、設定ファイルや新しい環境変数を優先させる仕 が少なくありません。 にも、新しい竟変数を導入して問題を鮹夬しているもの ー広これで目的は達成できました。現実のプログラム 不満その 5 : いろんなイ督はみを混在させるな ! る竟変数の不岡をぶちまけてしまいましよう。 日本群ヒの話をしたついでに、もう 1 つ日本語にかかわ 竟変数がいつばい きるようにしてください。 UNIX MAGAZINE 1995.11 らに、これらの項目本をひとまとめに指定できるよう、 れ独立してどの国の言語で表現するかを指定できます。さ 項目ごとに LC-XT,:r 環境変数が用意されていて、それぞ ロケールは、プログラム、日イ寸、金額などの決められた る竟変数も幅を利カせています。 LANG 変数に加えて、、、ロケール " という仕組みで使われ すのか、現状ではひどく混乱しています。もともとの どの環境変数が、、日本語にしなさい " という指示を出 LC ー ALL 環境変数も用意されています。これらにさきほど の LANG 竟変数も加わるので、すくなくとも 3 不頁の 竟変数が、英語と日本語の切替えに関与することになり ます。 と LC-ALL については、どのように使うかのル ールカ鴃まっています。現実は、かならすしも OS がサ ポートしているわけではないので、期待どおりに重川乍する とはかぎりませんが、理言侖十 . は間題ありません。ところが、 LANG ととの関係となると、もう、ルールも何も あったものではありません。 OS や使用するウインドウ・ システム、アプリケーション、 GUI などによって、 ・どの竟変数か有効力嘸効か ・どちらの竟変数を優先させるか が異なります。 たとえば、 man が日本語で表示されたときに、どの環 境変数によって日本語になったのか、すぐには判断できま せん。同しような理由から、 「このプログラムがこっちの環境では重川するけど、あっ ちの竟では重川乍しない」 というトラブルも多発しています。 LANG や LC ュで困ることがもう 1 つあります。それ は、 LANG やに設疋する値が、 OS 、ウインドウ・ システム、アプリケーションの不頁、バージョンによって j 墅う点で、づ % たとえば、以下はすべて EUC コードを使うようにする でしよう ? どれだけ現状カ昆乱しているか、手にとるように分かる ・ etIC ・ IIJIS ・ ja-JP ・ ja-JP. ujis ・ jp-JP. EUC ・ japanese 値です。 75
連載 / UN Ⅸ知恵袋ー・ 図 1 . netrc ファイ ) レ machine 7 れ ac ん乞れ e ーれ〃 e login / 04 をれ一れれ e password password チするファイル名のみを補完の↑嚇甫として取り扱うように なります。 2. 配列変数の要素を補完にする 補完の候浦を自分が定義した集合から作りたい場合があ ります。たとえば遠隔ログインコマンド rlogin は、ログ イン先の言算機名を引数にとります。 rlogin コマンドを使 う際に、いちいち計算機名を入力するのカⅷ倒だと感しる 人もいるでしよう。そのようなときはよく使う言 t 算機名を 配列変数に代入しておき、その要素を補完の↑嚇甫として選 ぶように設定すると便利です。 $ rhosts= (yamakasa kushida dontaku nakasu) $ compctl —k rhosts rlogin 配列変数 rhosts に遠隔言算機名を代入して、、、一 k " で補完の一甫にします。通常、変数の参照には $ rh 。 sts のように先頭に、 $ " を付けますが、 compctl での設定 のときには付けてはいけません。上記のように設定す ることにより、 rlogin の引数を補完するときの候補が、 yamakasa 、 kushida 、 dontaku 、 nakasu に限定され ます。 3. 動的にヒする情報を補完羅にする 配列変数を用いるガ去では、静的な情報しか補完刎嚇甫 にできません。しかし、重加勺に変化する情報を補完の候補 として取り入れたい場合もあります。たとえば、現在計算 機にログインしているユーサーと、 talk コマンドでおし ゃべりしたいときなどがこれにあたります。補完の対象は ューザー名なので、、、一 u " でもよいのですが、ログインし ていないユーザーまて含めて補完刎甫にするのは効率が よくありません。そこで、現在ログインしているユーサー を調べる who コマンドの結果を利用します。 ます、配列変数 reply にユーサー名を代入する関数を 作ります。 $ active-users ( ) { > reply=('who ー awk '{print $ 1 } ' ( ) -K" を使って、この関数を補完↑嚇甫を作る関数 として補完規則を設定します。 $ compctl —K active—users talk 94 補完をおこなうたびに、 who コマンドて補完候補を作 りなおすので、実際にログインしているユーサーしか候補 に挙がってきません。 別刎列を挙げます。算樹でファイルを転送する ftp コマンドは、ホームディレクトリ上に . Ⅱ etrc というフ ァイルを作ることによって、 FTP ログイン時のユーザー 名とパスワードの入力操作を省けます。 .netrc の書式を 図 1 に示します。 machine-name 、 10 のれ一れ me 、 ass 囮 0 は、それぞ 遠隔計算機の名前、遠隔言算機でのログイン名、〕鬲 計算機のパスワードです。これを遠隔言 t 算機の数だけ続け て言当します。本題からは外れますか : . netrc ファイル については注意しておくべきことがあります。 . netrc フ ァイルはパスワードの入力を省くために、本来秘密である べきパスワードをファイルに記述しなければなりません。 パスワードの漏洩を防ぐため、 .netrc ファイルは他人に 見られないようにファイル・パーミッションを設定しな けれはなりませんが、やはりパスワードをそのままファイ ルに書くことはきわめて危険です。 . netrc ファイルは、 anonymous FTP にだけ用いるようにするのか賢明でし よっ。 anonymous FTP ならは、 asswo には自分の 電子メールアドレスを書くだけですみます。 話を元に戻しましよう。 . netrc ファイルの 2 列目に は、避鬲言算機の名前か当してあります。そこで、次の ような関数を定義します。 $ ftp—hosts.com/lete ( ) { > reply=( 'awk '{print $ 2 } ' $HOME/. netrcC) そして、補完規則を次のように設定します。 $ compctl —K ftp—hosts.com/lete ftp すると、 . netrc ファイルに言算機を追加するだけで、 ftp コマンドで補完される計算機も . netrc の内容を央 したものになります。 4. 特定の文字列て始まる文字列をイ羅にする zsh の内部コマンドに kill 、 fg 、 bg コマンドが あります。これらのジョブ制御コマンドは、制御す るジョブを通常用いるジョブ番号やプロセス ID の UNIX MAGAZINE 1995.11
連載 / プログラマー入門ー⑩ 1 つの竟変数を設定するだけで、いろいろなプログラム 「どのコマンドて表示しよう」 か 1 司しように動いてくれます。 とか、 たとえば、 PAGER 竟変数は、 「どうやって表示コマンドを変更できるようにしよう」 ・ man コマンドでマニュアルを表小するとき なんて悩ますにすみます。 PAGER に設定されたコマンドを ・ mail コマンドで届いたメールを表小するとき 利用することにすれば、これらの 2 つの問題がいっきに 解決します。 などに利用されます。 残された問題は、 PAGER か設定されていないときにどの どの工竟変数を、どのような意未で利用するかはプログ 表示コマンドを使うかですが、これは、 UNIX のコマンド ラムの自由です。また、竟変数の不頁はプログラムの都 を真似るのカ立一番。たとえば、 man コマンドは PAGER が 合に従って自由に増やすことかて、きます。そこで、竟変 設定されていなければ rn 。 re コマンドを使います。同しよ 数は個人の竟をカスタマイズするもっともお手軽な手段 うに、あなたの作ったプログラムでも、 PAGER が設定さ として利用されています。 れていない場合には more コマンドを使うようにすれは、 でも・ 問題はすべて鮹夬てす。 不満その 3 : 憶えづらい長い名前の竟変数を使うんしゃ 環境変数のおかげで楽な思いができるのは、プログラ ムを作る側だけではありません。プログラムを使うューサ ーにとっても、標勺な環境変数はありがたい存在です。 標準的な竟変数 PAGER に設定するだけで、 man も mail も同しコマンド UNIX の環境変数の便利な点は、標勺な環竟変数が でマニュアルやメールの内容を表示してくれます。または なんとなく決まっていることです。 かのプログラムも、長いテキストを表示するときにはおそ ある日の新米システム管理者と古参システム管理者の会 らく PAG 田の設定を使ってくれるでしよう。 話を聞いてみましよう。 プログラムを作る側と使う側のあいだに、オ剽勺な竟 変数という暗黙の了解があるおかげで、カスタマイズの仕 : 先輩、例のプログラム作りましたよ。 組みを考えたりドキュメントを詩ヾるのに手間をかけなく 古参 : おお、ありがとさん。 てもすむのです。もっとも、この、、暗黙の了解 " を知らな : でね、ファイルの内容は m 。 re で表小するようにし い初じ、者にとっては、 UNIX がひどく不思議なシステム ーー 0 にみえてしまうという欠点もありますが。 古参 :more か。俺は view のはうか好きやから、 view も 表 1 に、 UNIX のコマンドでよく利用される環境変 できるようにしといてくれへんか ? 数を示します。プログラムをカスタマイズするときやコ そして、数分彳た マンドを使うとき、プログラムを作るときに役立ててくだ : 先輩、 view できるようにしましたよ。 竟変数の争奪戦 古参 : ふんふん、どれどルオーケー。ところで、 more と view はどうやって切り替えるんや ? UNIX の環境変数の不便な点は、標準的な環境変数を ソースプログラムのここを変更して、コンパイルし さまざまなプログラムカリ用することです。 なおしてください。 「あこれってついさっきはイ叫リだって言わなかった 古参 : あほう、 PAGER を見るようにせんかい ! つけ ? 」 すでに紹介したように、 PAGER は、テキスト表示のコ 竟変数を 1 つ設定するだけで、いろんなプログラムの マンドを設定する竟変数として使われています。このこ 重川乍を一一挙に制御できるので、面倒くさがり屋さんには便 とを知っていれは、テキストを表示するプログラムを作っ 利なのですが、 たときに、 73 UNIX MAGAZINE 1995.11
P/IP AppIications WINDOWS 連載 / UN Ⅸ知恵袋ー・ 数を紹介します。 ・関数の引数をオ褓内する変数 引数は $ 〃というかたちで関数に渡されます。れには数 字が入り、数字に対応して第 1 引数、第 2 引数・・ となります。 $ * は関数に渡された引数本を、 $ # は引 数の個数を表します。 ・プロセス ID をオ褓内する変数 $ $ には、これを評価したシェルのプロセス ID かオタ されます。ュニークな名前の一刊芋ファイルを作るときに 役立ちます。 $ ! は最後に実行したバックグラウンド・プ ロセスの ID を表します。 ・終了コードをオ褓内づ - る変数 $ ? は最後に実行したコマンドの終了コードを表します。 コマンドの実行結果によって処理を変更するときに使い ます。 ・ワード境界をオ褓内する変数 $IFS はワードの境界を表します。通常は空白文字、タ プ、改行が設定されていますが、これによってワード境 界を変更することができます。たとえば、 $IFS を ( コロン ) にすると、 /usr/bin:/usr/ucb:/usr/X11/ bin は /usr/bin 、 /usr/ucb 、 /usr/X11/bin の 3 ワ ードとみなされます。 関数を作るとき、関数内でのみ利用する変数が必要にな るかもしれません。関数は実行したシェルで動作しますか ら、変数を書き換える操作はそのまま実行したシェルに反 映されます。関数内だけて利用する局戸廂勺な変数が必要な ときは、 zsh の内部コマンド local で明カ苅勺に亘言しなけ れはなりません。 例として、指定したコマンドをコマンド検索パスのなか から探し、みつかったものすべてを表示する関数 where を作ってみます。 where ( ) { 10Ca1 ifs dir if [ $ # —eq 0 ] ; then echo Usage : where command _to_search return [ アプリケーションパッケージ ] ChameIeon から選りすぐったインターネットツール集 ・ Chameleon 77 , 000. Windows 用 TCP/IP アプリケトションパッケージ ・ Chameleon NFS 98 , 000. 戊イサーバメレオンを ・ Chameleon X 127 , 000. ChameIeon と X サーバのパッケージ 148 , 000. ChameIeon NFS と X サーバを統合したパッケージ ・ ChameIeon 32NFS 136 , 000. Windows NT 用 Chameleon と NFS クライアント / サーバ統合したパッケージ ※上記の価格には消費税は含まれておりません。 CHAMELEON? ■インストールとセットアップは約 5 分で完了よ , ・ 100 % DLL 対応により常駐工リアは 6 K バイト以下。 ・多彩な TC 円旧アプリケーションを標準装備。 ・最大 64 もの TC 円旧セッションを同時に実行可能 ・ 4.3BSD ソケットと Windows Sockets 1.1 をサポ - ト。 ・ SNMP 拡張工ージェント機能を搭載。 M 旧 , M 旧川 DOS,Wlndows, Workstation をサポート Ethemet, Token Ring, FDDI, SLIP(Serial Line 旧 ) をサポート。 ■旧ルーター機能 , ゲートウェイ機能 ッションを実行可罷こツライアントお ■複数のウインドウで同時に TC 円旧 よびサーパ両方をサポート。 ■ LAN ( ローカルエリ。アネットワークおよび S 凵 P を同時ド型男可能。 ー S 凵 P モデムはオをトダイヤル機能を装備。 •MultiLANTU ドライバにより NetWare,LAN Manage 「等と共存可能。 ・ネットワークプリンタ機能、クライアントおよびサーパ両方をサポ。 = : , ト 0 忘 = を ■ Windows のユ←ザインターフェースを採用しているので操作が簡単。 ■ファイルマネージャや他の Wi 面 ow アプリケ - ションから、 NFS ドライプに マウント可能。 ・パスワードによる各種設定のセキュリティ機構。 ・オプションで開発キットを提供 (NEWT-SDK, RPC-SDK)o ま第凛に上第 ' 第第 = 、 リをトを 0 ・ 0 ( 、い工 GE ネットマネージジャパン株式会社 東京都千代田区三番町 2 番地 KS ビル〒 102 TEL:03 ( 3221 ) 8400 FAX:03 ( 3221 ) 8484 ・旧 rne ℃ ham 引 eon についてのお問い合わせは上記弊社まで ・その他 Chame 厄 on 製品は下記の代理店より販売しております 株式会社フォーバルクリエーティブ TEL:03 ( 5800 ) 2831 ネットワンシステムズ株式会社 TEL:03 ( 5462 ) 0810 住友金属工業株式会社 TEL:03 ( 5476 ) 9825 ・インターネットでの情報サービスも実施中です E-Mail: info@netmanage.co.jp ホームページ : http://WWW netmanage. co.jp れ p サイト : ftp.netmanage.8ゆ ifs=$IFS ( e cho $PATH ( fO て dir do M 【類第 ONC/NFS tIN Ⅸ ) 、、 5 ~ 資料請求 No ℃ OC 97 UNIX MAGAZINE 1995.11
連載 / プログラマー入門ー⑩ 表 1 よく堋される変数とその 韶 ) 設をやめる。 1 の、、あきらめる " というのは、しつはもっとも多くの テキストを表小するコマンド。 man コ PAGER マンドがマニュアルページを表小する 人に採用されているガ去なのですが、これでは問題解決に ときなどに使用する はなりませんね。 テキストを編集するコマンド。 mail を 2 と 3 は同しことで、どちらでもよいと思うかもしれま 編集するときなどに使用する プリンタ名。印刷時のプリンタ指定な せんが、 ~/ ・ profile や ~/. cshrc に設定しておくかお どでイ更用する かないかで、大違いの場合があります。 ューザー名。 login 時に自動第勺に設定 USER 、 LOGNAME たとえば、ⅵからシェルを起動して、その上でコマン される ホームディレクトリ。 login 時に自動 ドを実行する場合です。ⅵのコマンド行から、 HOME 的に言される。スタートアップ・ファ イルを探すときにイリ : ! shell-command 工見在 . のシェノレ名。 vi からシェノレコマン ドを起動するときなどに使用される とすると、 shell-command を実行する前に file や ~/ . cshrc の内容が自重加勺に実行されます。 「このプログラムだけは別の動きをさせたい」 たとえは、 ~ /. p て ofile や ~/. cshrc に日本語の設定 というこだわりの人には向いていないかもしれません。 をする、 LANG=ja—JP. EUC ; export LANG 古参 : あー、 man が日本語になってしまった。 日本語しゃいけないんですか ? とか、 古参 : 当り前や。 man は英語て読むもんや。 setenv LANG j a-JP. EUC : えー、どうして。ばく、英語なんて読めない。 か書かれていれば、 古参 : 元か英語のやつを日本語で読むと、 まがいもんをつ かまされるで。 : ! man 田 日本語で man 最丘は UNIX でも日本言ヒが進んで、 は日本言韶 ) マニュアルページを表示します。これらのファ カめるようになってきました。しかし、古参システム管 イルに英語の設定か書かれていれは英語のマニュアルペー 理者のように、 man を英語で読むことにこだわる人もい ジを表示します。シェル以外からコマンドを実行したとき ます。ところが、 man を日本語で表小するか英語で表示 でも、ちょっとした技て英語と日本語を切り替えることは するかは、通常は標軸勺な環竟変数を利用して決定するの できますが、 ~/. profile や ~/. cshrc はいいかげんな で、上の例のように、実行するプログラムによって日本語 設疋にしないほうがよさそうですね。 と英語を使い分けたいときには困ったことになります。 プログラムを作る人に対しての注文です。 たとえば、 LANG 竟変数は日本語と英語の切替えを指 不満その 4 : 標準の環竟変数にはかり頼ったらあかん ! 示する変数です。ところが、この変数は man だけではな く、ウインドウ・システムのようにやはり日本語版と英語 オ剽軸勺な竟変数を参照するプログラムを作る方は、標 版を区別したいシステムからも参照されます。 準とは違う重川乍をさせたいときの逃け道も用意しておいて では、ユーサーはこの問題にどう対処すればよいのでし ください。 ・コマンド行オプションで設定を変えられる ・サプコマンドで設定を変えられる 1. あきらめる。 2. LANG を未設定 ( 英語の設定 ) にしておき、必要なとき 設定ファイルの言当で設定を変えられる ・オ剽勺でない竟変数を用意して、標準の工竟変数より のみ日本言韶 ) 設定にする。 3. LANG を日本言韶 ) 設定にしておき、必要なときのみ日本 も優先させる 1 三ロ EDITOR PRI NTER SHELL 74 UNIX MAGAZINE 1995.11
連載 / IJN Ⅸ知恵袋ー・ if [ -x $dir/$l ] ; echo $dir/$l fi done IFS=$ifs then 最初に $ # で引数の個数を調べ、引数カ甘旨定されていな かったら使い方を表示して終了します。引数が与えられて いたら、 $ PATH に設定されているディレクトリに第 1 引数 $ 1 で指定されたコマンドが存在するかを調べ存在すれ ばそれを表示します。 $IFS を、、 : " に設定することによっ て、 $PATH をディレクトリ単位に分割しています。 オートロード関数の設定 zsh では、必要になるまで憫数をメモリ上に読み込まな いように設定することカそきます。このように設定された 関数をオートロード関数と呼びます。オートロード関数を autoload / れ Ct 0 れ一れ 07 れ e [ 工社れ Ct を 0 れ一れ 07 e 内部コマンド autoload を使います。 ある関数がオートロード関数だと宣言するには、 zsh の 指定する。 2. オートロードする関数の本体をオ褓内するディレクトリを 1. オートロードにしたい関数を宣言する。 利用するためには、 2 つの前処理が必です。 $ autoload where るには次のようにします。 とえは、さきはどの関数 where をオートロード関数にす れ c 。れ一れ佖 me は、オートロード関数の名前です。 た 98 undefined vhere ( ) $ which where してみると以下のようになり、未定義だと分かります。 数として登録されます。 which コマンドで where を検索 autoload を実行した時点で、関数 where は未定義関 $ unfunction where を使います。 ください。関数を解除するには、 unfunction コマンド ません。関数 where を解除してから一ヒの例を試してみて すでに関数 where か完義されている場合はうまくいき 次に、オートロード関数本体を置くディレクトリを設定 します。たとえば、 -/lib/funcs にオートロード関数を格 納する場合は、次のように酉改」変数 fpath を設定します。 $ fpath= C/1ib/funcs) オートロード関数が複数のディレクトリにあるときは、 それらのディレクトリを空白文字で区切って配列変数 fpath に設定します。 $ fpath= C/1ib/funcs /share/lib/zsh/funcs) そして、配列変数 fpath で指定したディレクトリに関 数名と同名のファイルを作り、そのなかに関数の処理を記 述します。ファイルでは、関数の定義をおこなうか、関 数本体を記述します。ですから、関数 where の例だと、 -/lib/funcs に where という名前のファイルを作り、内 容は以下のいすれかにします。 ファイル where の内容は、たとえば次のようになりま 2. 関数本体をする場合 書きます。 例て示した関数 where の定義を、そのままファイルに 1. 関数定義をする場合 後者の場合、ファイルに実行属性を付ければ、そのまま IFS=$ifs done echo $dir/$l if [ -x $dir/$l ] ; then do for dir in ( echo $PATH ' ifs=$IFS echO Usage : where command—to—search if [ $ # -eq 0 ] ; then 10Ca1 ifs dir す。 シェル・スクリプトとしても使えます。 ファイル名の生成 UNIX MAG AZINE 1995.11 マッチするので、 ルのま定のことです。たとえば、 * はすべての文字列に ファイル名の生成とは、 、、 * " や、、 ? " による複数ファイ