AUC TEX—① 当然のことながら、この部分では補完機能は働きませ ん。適当なタイトルを考えて入力してください。 セクション・コマンドの直後に label コマンドを付け ておくと、あとでそのセクション番号を label コマンドに 与えた名前で参照できます。とくに長い文書を書くときに は、あらかじめ label コマンドを付けておいたはうが便利 でしよう。 AUC rIbX は安己り屋さんなので、 C-c C-s でセクション・コマンドを入力するときに label について も訊ねてきます。 What 1abe1: sec: あらかしめ入力されている sec:" は、 section のラベ ルを示すプレフィックスですにれも簡単に変更できます ) 。 label コマンドは図番号や表番号にも使うので、区別しや すくするためにこのような文字列をデフォルトで与えてい ます。もちろん、気に入らなけれは・これを消して適当な文 字列を入力してもかまいません。 デフォルトが表示されている状態でリターンキーを押す と、 label コマンドは挿入されません。 label はいらない からといってわざわざデフォルトの文字列を消してからリ ターンキーを押すと、空の label コマンドカ材入されてし まうので注意してください。 囃竟の入力 文書スタイルも竟の入力の一種でしたが、ここではそ のはかの竟を入力してみます。 C-c C-e と入力すると環 境の不頁を訊かれますが、今度はデフォルトが itemize になっています。文書スタイル名を入力するときは、これ が document になっていました。 1 つのソースファイル のなかで 2 つ以上の document 環境を使うことはないの で、デフォルトが itemize になったわけです。ご推察ど おり、この設定も簡単にカスタマイズできます。 itemize 系土竟 まず、デフォルトのまま itemize 環境を入力してみま \end{itemize} \item \begin{itemize} す。 itemize や enumerate など、環境内で \item コマ と挿入され、カーソルが \item の後ろに移動したはすで 116 ンドを使うリスト環境では、最初の \item も自動的に挿 入されます。ちなみに、 description 環境では \item [ ] カ材入され、カーソルは [ ] のあいだに置かれます。 1 つの項目を書き終えて次の項目に移るときは、 C-c LFD (M-x LaTeX-insert-item) と入力します 11 。すると、次の行の適当な位置に \ item カ材入されます。 table 囃竟や figure 竟の入力のうち、もっとも手間のかかるのが table や figure です。ここでは、 table 環竟を例に説明します。 C-c C-e に続いてミニバッフアで環境名 table を入 力すると、表の位置を指定する table 竟のオプション引 数の入力を求められます。 F10at to : tbp では表や図をまとめて、、フロート " と呼びます が、これをどこに置くかと訊ねているわけです。 htbp の うち 1 文字、または複数の文字を組み合わせて置き場所 の優先順位を指定します ( 詳しくは、のマニュアル などを参照してください ) 。何も指定しないと、 tbp を指 定したのと同じことになります。そんなオプションは知ら なかったという人は、そのままリターンキーを押してくだ さい。 Caption : と表示されたら、表のキャプションを入力します。 セクション・コマンドの入力と同様、 label についても 訊ねてきます。 Labe1: tab: label のプレフィックスは、 table では、、 tab : では fig : " がデフォルトです。 通常、論文などでは図表をセンタリングしますが、 AUC rIbX はそれもサポートしています。 Center: (y 0 てⅡ ) 11 - ヨ殳に、 LFD には c-j カリり当てられています。 figure UNIX MAGAZINE 1993.9
AUC TEX 表 4 外部コマンドー覧 コマンド名 BibTeX Check FoilTeX lndex LaTeX Other Print SliTeX SpeII TeX jBibTeX jLaTeX jSliTeX jTeX 起動するコマンドの不頁 BIBTb,X チェッカ (lacheck) FoiIrIbX 索引作成 (makeindex) その他 印刷コマンド スペルチェッカ プレピューア 日本語 BIBTbX 日本語いさ 日本語 SLfIbX 日本語 図 10 日相ハ実行中の醯 wwunentstyle{jarticle} \begin{dcmnent} \section{ はじめに } \ 21 { sec : t 司 AIE \TeX はとても便利です。みなさ松Ⅵを使いましよう ! ALt \TeX には次のような利があります Runmng ・ J 語 T 臥 ' on 'auc' with ' tajlatex \ to e \ 川 put { al-c. tex}' BigTeX, C Version 2 一 jl. 7e ( for し (/wr/1æaV1ib/tex/macms/jart10. sty)) (aw.aux) Dccuænt Sty1e 'jarticle' く 18 Dæ圏〉 . (auc.tex (れ歌/18a1/1ib/teX/0印r0S/ 、 jarticle. sty T Version 2. く 24 MQ' 1 〉 ー止引 : ーー料 = ー 1 ⅵそ 广 : 町ヤ L 日を : い」 * スライド作成用の rIbX のパッケージでむ ミニノヾッファ モードならデフォルトが jLaTeX となり、 それでは、 C-c C-c を実行してみます。日本語 I kX ままリターンキーを押すだけですむことが多いでしよう。 て適当なデフォルトを設定してくれるので、デフォルトの が、 AUC はその時点で軻を実行するべきかを判断し もちろん、実行するコマンドを指示する必要はあります 印刷コマンドなどがこのコマンド 1 つで実行できます。 BIBTb,X makeindex 、スペルチェッカ、プレピューア、 tex-site. el の設定にもよりますが、 rIVfX や I 盟、 まざまな外部コマンドを実行するためのコマンドです。 これはだけではなく、 AUC からさ Command : (default jLaTeX) に次のように表示されるはずです。 118 12 もちろん、 tex-site. el などが正しく定されている場合で扎 コマンドは jlatex であるとか、 Spell お尺したときに ば、 jLaTeX というコマンドお尺したときに実行される 類に応して AUC で定義している名前です。たとえ は実際に起動するコマンドの名前ではなく、コマンドの種 表 4 のようなコマンド名カ俵小されます。ただし、これら す。 tex-site. el の設定に追加・変更していなければ、 キーを押すと補完機能が働いて尺肢の一覧が表示されま べてみましよう。上のように表示されている状態で、 TAB その前に、どんなコマンドか起動できるのかちょっと調 バッフアの内容が処理されます 12 こでリターンキーを押すと日本語 I FX カ起動さ 実行されるコマンドは ispell であるといったぐあいで す。これらの設定は、 tex-site. el でおこないます。 jLaTeX を尺すると図 10 のように画面が 2 つに分割 さ上半分にはいままでのバッフアが、下半分には日本 語 I からの出力か表示されます。 下半分のバッフアでは、モード行の表小が、 (jLaTeX compiling [ 0 ] : て ) " と変わり、プロセスを実行中 であることを示します。 [ ] のなかの数字は、現在処 理中のページ番号です。長い文書を処理しているときな どは、この数字を見れば何ページ目まで進んだのか確認 することができます。 7.2 からは上半分のバッフア、つ まり I*TVfX のソースファイルのノヾッフアのモード行に も c 。 mpili Ⅱ g と表示されるようになりました。このた め、長い文書を I*TEX で処理しているあいだにそのソー スファイルのバッフアを画面全体に拡げて作業していて も、処理カ鮗ったかどうかカ忍しやすくなっています。 UNIX では IATbX などのコマンドは非同期プロセスと して実行されるので、プロセス実行中も編集作業を続ける ことができます。編集中に処理の進行が気になったら、 C-c C-I (M-x TeX—recenter-output—buffer) で、からの出力の最後の部分か表示されます。 C-c C-I を入力し続けると、処理が進行していく様子が次々に 表示されますが、あまり生産的とはいえません。 I*TEX などの処理中に気力畯わってその処理を中断し でプロセスを強制的に終了させることができます。 C-c C-k (M-x TeX-ki11-j ob) たくなったら、 UNIX MAGAZINE 1993.9
環境変数とシェル変数が異なるのは、設定方法だけで はありません。もっと重要な違いがあります。 シェル変数 : シェルがその設定状況と値を利用する。 変数 : シェルから起動されるコマンド ( 子プロセス ) がその値を使用する。 つまり環境変数とは、シェルを経由してシェルから起 動されるプロセスに、なんらかの情報やデータを伝達する ための 1 つの手段なのです。ューザーはシェルに対して 環竟変数を設定することで、シェルから実行するコマンド の、、竟 " を構築できるようになっています。 もちろん、シェルからコマンド ( 子プロセス ) に渡され た環境変数とその値を使うかどうかは、コマンドごとに決 められています。たとえば、 SunOS の wc コマンドは、 環境変数 LANG の値によってファイル中の文字数の数え % setenv LANG japanese 方カ畯わります ( 1993 年 6 月号 ) 。 % vc 9306. tex 872 719 % unsetenv LANG vc 9306. tex 719 871 14829 9306. tex 23779 9306. tex LANG に設疋されていて値が japanese ならば、 EUC の 1 文字を 1 文字として、そうでなければ EUC は 2 文 字 ( 2 バイト ) として数えられます。 UNIX では、この ように環境変数の値を参照して動作を変えるコマンドが 数多く提供されています。環境変数の詳細について調べ たい方は、『続・たのしい UNIX 』の 1.18 節および 3.2 節を参照してください。 Bourne シェルのパラメータ そろそろ本題に入りましよう。 Bourne シェルでも C シェルと同しように変数カリ用できます。ただし Bourne Bourne シェノレのノヾラメータに キーワード・パラメータ ようです。 シェルでは、変数ではなくパラメータと呼ぶのカ立ヨ勺な は、 UNIX MAGAZINE 1993.9 ・キーワード (keyword) パラメータ IJN Ⅸへの招待⑩ 位置 (positional) バラメータ の 2. 不鶤頁があります。今回は、キーワード・パラメータ について説明しましよう。 キーワード・パラメータは、次のような形式で設定しま す (C シェルでは変数の設定に set コマンドを使いまし たが、 Bourne シェルではキーワード・パラメータを設 定するコマンドはありません ) 。 変数名 = 値 たとえば、 dir に /home/aya を値として代入するに は、次のように入力します ( ここでの $ は、 Bourne シェ ルからのプロンプトです ) 。 $ dir=/home/aya 変数名には、どのような名前を使ってもかまいません。 ただし、使用できる文字は英字と霆とアンダースコアの みで、先頭は英字でなければなりません。 C シェルの set コマンドは、 % set a=aya b=baby c=child のように、 1 回のコマンド実行で複数の変数とその値か轂 定できます。同様に、 Bourne シェルでも 1 行のコマン ド入力で複数のパラメータか設定できます。この場合は、 変数名 = 値 を 1 つ以 E の空白をおいて繰り返し入力します。たとえ $ a=aya b=baby c=child は、 などとします。 れます。 C シェルでは、 こではパラメータ a と b と c が設定さ set 変数名 = ( 値 1 値 2 値 3 ... ) という形式で変数に複数の値を代入し、あとてイ直を個別に 使用できます。しかし Bourne シェルでは、ユーザーが 定義するキーワード・パラメータに複数の値を代入し、そ 167
BSD 系の lint コマンドは、 Sun の lint コマンドに はないオプションもあります。それが一 p オプションで す。これは UNIX マシン以外の C 言言、移植する場合 に、間題点を検査するオプションです。このオプション を指定すると、標準的なライプラリとして用いられる、 /usr/lib/lint/llib-lc . 1 Ⅱ の代わりに、 /usr/lib/lint/llib-port . ln ファイルが用いられます。前回紹介しませんでした が /usr/lib/lint ディレクトリにあるファイルで、 . 1 Ⅱで終っているにもかかわらすファイル名の先頭が llib ー 1 とはなっていません。これは、 lint に対して通 常の一 1 オプションを使って指定するものではないから です。ファイルの内容は前回紹介した通常のライプラ リ・ファイルと同様です。 -p オプションを指定した場合には、標準ライ プラリが変わるだけでなく、より厳密な検査がおこなわ れたり、識別子の長さに制限が加えられその状態で検査 がおこなわれるようになります。実際には、内部的な識 別子は 8 文字、外部的な識別子は 6 文字までで、大文字 小文字か統一された状態で検査されます。これはかなり 厳しい制限ですが、真の移植生を目指すのであればこの あたりまで留意しなければならないようです。しかし、 通常はこの検査にかかる前に、入出力の方法などが原因 で移植できなくなる場合が多いので、このオプションは さほど気にしなくてもいいでしよう。移植のターゲット となるようなマシンは、このような厳しい制限のもので はなく UNIX と同程度のものが多いので、オプション を気にしてプログラミングがきゅうくつになるくらい ならこのことは忘れてしまってもかまいません。 System V 系の lint System V 系の lint コマンドは、その出力形式から BSD 系のものとは異なります。 Sun の場合は通常動作 する /usr/bin/lint ではなく、 /usr/5bin/1int を 実行させることで System V 系の lint コマンドの動 きをみることができます。 7 月号で使った -u オプシ ョンをテストするプログラムを、 /usr/bin/lint と /usr/5bin/1int の 2 つで動作させてみましよう ( 実 156 行例 ) 。この出力を見ても分かるように、出力の形式は 異なるものの出力されているメッセージが意味するも のは変わりません。 このほかの違いとして、 BSD 系と System V 系で はオプションの意味が異なるものがあります。 long へ の代入を検査するオプション -a は、 BSD 系では機能 を設定するものでしたが System V 系では機能を無効 にするためのオプションとなります。同様に、 -b 、 -h 、 -x オフションも設定 / 無効の意味が逆になっています。 複数のマシンで正しく lint コマンドを使うには、自分 が使っている I ⅲ t でこれらのオプションがどちらの意 味かをつねに確認する必要があります。 また、 System V 系の lint コマンドでは、 C コン パイラに与える最適化を指定するオプションも受け付 けることができ、一 g やー 0 といったオプションが指定 されてもこれらを無視します。この機能は、 Makefile のなかなどで lint コマンドを起動する場合には便利で しよう。これらのオプションが無視されるので、通常の コンパイル「ド業に設定するものと同じオフションを lint コマンドに対しても使えます。また、 -c オプションも C コンパイラのものと同様の意味をもつようになって おり、ちょうど Sun の lint コマンドの一 i オプション と同じ役割をはたします。 System V 系のマシンだけを使っているぶんには大 丈夫ですが、 Sun を使っているときに System V 系の lint コマンドを使う場合や、 System V 系のマシンと BSD 系のマシンが共存する環境などではほかのプログ ラムとの相性の点で間題になることがあります。その 1 つが error コマンドです。 error コマンドは、 C コ ンパイラや lint などが出力するエラーメッセージを見 て、エラーを含んでいるソースファイルのなかにその工 ラーメッセージを埋め込むプログラムです。通常は、 % lint ファイル名ー e てて or とすれば、 lint コマンドの出力するメッセージがフ ァイルのなかにコメントとして埋め込まれます 5 。と ころでこのプログラムは、 /usr/ucb の下に格納され ています。つまりこれは BSD 系のプログラムです。 /usr/5bin/1int の出力のはうが好きだからという理 5 通常のエラーメッセージとは異なり、 lint の出力するメッセージは 標準出力に出力されます。 UNIX MAGAZINE 1993.9
AUC TEX—① 図 9 C-c C-e による→の文囎劼、院了した状態 表 3 C-c C-s コマンドの引数 \docuuentstyle{jarticle} \end{dæuænt} % Lcr . Variab1es: % e : japaneæ-LaTeX % TeX-master: t AppUYing style ... do ー * ー「 11114. 日リ二たド = 引数 省略または nil リスト (C-u のみ ) 負の数 0 1 2 3 4 5 6 選択されるレベル 現在のレベノレ 現在よりも 1 関架いレベル 現在よりもその数だけ遡ったレベル part chapter section subsection subsubsection paragraph subparagraph いに T FI 」トつ 11 ー とすれば Emacs お得意の補完ができます。こういう場合 にかぎらず、 AUC rIbX ではミニバッフアで入力するさ まざまなものに対して補完機能力硬えます。いろいろな場 面で試してみるといいでしよう。 最後に、オプションのスタイル名を訊かれます。 Options : の表示に対して何か入力すれば、 \documentstyle{} の オプション・スタイルとなり、 、 [ ] " ( プラケット ) で囲 まれて挿入されます。ここでは、リターンキーだけを押し ておきましよう。 こまでの説明どおりに入力すると、図 9 のような画面 になります。たった 1 つのコマンドでこオレごけの対話がお こなわそれに従った内容力甘市入されるのです。なかな か気力リいていると思いませんか ? かえって煩わしいと 感しる人もいるでしようが、デフォルトの設定やユーザー にュる項目の変更など、自在なカスタマイズが可能なの で、好みに合わせで商な環境か構築できます。 セクション・コマンドの入力 それでは、本文を書いていきましよう。短い文書です が、セクションを分けることにします。 \section{} など のセクション・コマンドを入力するには、 C-c C-s (M-x LaTeX—section と打ち込みます。 Section ( セクション ) の S と憶えまし 例によって AUC rIVyX との対話カ駘まります。最初は セクション・コマンドのレベルを訊ねてきます。 section 、 UNIX MAGAZINE 1993.9 subsection など、すべてのセクション・コマンドを 1 つ の C - cC ー s で賄っているので、どのレベルのセクション を作りたいのかを指定しなけれは・なりません。 SeIect 1eve1: (default section) デフォルトでは section になっていますから、それで よければそのままリターンキーを押します。これ以外のも のにしたいときは、その名前を入力します。もちろん、 こでも補完機能力硬えます。 この例では、文書スタイルが jarticle て最初のセクショ ン・コマンドでしたから、デフォルトは section になっ ています。しかし、このデフォルトは状況によって変わり ます。基本的には現在のレベル、つまりカーソノ耳立置より も前にセクション・コマンドがあればそれと同しレベル、 なけれはその文書スタイルで利用できる最大のレベルにな ります 10 C-u C- c C- s と入力すると、デフォルトか現在より 1 関架いレベルにな ります。たとえは、現在のレベルが section なら subsec- tion になります。 C-c C-s コマンドで指定できる引数と、 それによって決まるレベルを表 3 にまとめておきます。 デフォルトを変化させるだけなら、表 3 のような複雑な 引数は必要ないと思いますが、セクションレベルをいちい ち訊かないようにカスタマイズすることもできます ( その 場合は、表 3 の引数でセクションのレベルを指定します ) 。 次はタイトルです。 What title : 10 ただし、 part は除きます。また、 7.1 にはバグがあり、 jreport な どのスタイルで最大レベルが section になってしまいますが、 7.2 では chapter になるように修正されています。 115
連載 /UNIX Communcation Notes リスト 7 nslookup での finger の実行 > raicho. rd. ecxp. osaka—u ・ ac ・ JP ・ 133. 1 .84. 1 Re al Name User [raicho. rd. ecip ・ osaka—u ・ ac ・ jp] > finger Address : raiChO Name : Address : Server : giants 192.9.200. 13 ・ maJ or ・ ac ・」 P ・ . rd. ecip. osaka—u ・ ac ・ JP What ldle 1 day , 3 : 26 0 : 05 TTY baba Ken—ichi Baba 192.9.200. 13 Address : Server: yankees. ma」0て・ ac ・ JP ・ > 1 .84.1.133. in—addr. arpa ・ > set type=ptr suguru Suguru Yamaguchi ohkava Takenao Ohkawa matsuura Toshio Matsuura Host raicho as ama raiChO raiChO CO 取 S01e Location (marines . aist—nar) ( 133.1.18.128 ) (asama. rd. ecip. os ECIP (okhotsk. rd. ecip. ECIP 1 .84.1.133. in-addr. arpa host name = raicho. rd. ecip. osaka—u ・ ac ・ JP > finger Finger : no current hOSt defined. ls コマンドではオプションも指定できます。たとえば、 > ls —a maJ0r. ac ・ JP ・ とすると、そのゾーンで定義されている別名に ついての一 コマンドを使うと内容をソートして出力できます。たとえ ムサーバーの応答どおりの順番で表示されますが、 view 分かりやすい表示で見たいものです。 ls の出力では、ネー ls コマンドの出力を保存したファイルを参照する場合、 ファイルの とめておきます。 覧表示か得られます。表 2 に、指定できるオプションをま 意 6 のようにします。 > viev f00 は、 ls の出力を収めたファイルを foo とすると、 UNIX MAGAZINE 1993.9 finger コマンドは、直前に検索されたホスト ( カレント 対して finger を実行することができます。 nslookup の ネームサーバーでホストを検索した場合、そのホストに finger の表示 いるようです。 表示されません。ソート機能があるために、このようになって のみ有効なコマンドです。それ以タ P ) ファイルでは、まともに view コマンドは、 ls コマンドの出力を収めたファイルに ホストと呼ふ、 ) に対して finger を実行し、その結果を出 力します。リスト 7 を見てください。 ます、 raicho. rd. ecip. osaka-u ・ ac. jp. を検索します。 これによって、カレントホストが raicho. rd. ecip ・ osaka- u ・ ac ・ jp ・に設定されます。 こで finger を実行すれは、 raicho. rd. ecip. osaka-u ・ ac. jp. の利用者の状況を出力し てくれます。 次に、 IP アドレスからホスト名の検索をしてみましょ ーでは、 1.84.1.133. in - addr. arpa. を検索します。 これによって、このアドレスが raicho. rd. ecip. osaka- u ・ ac. jp. のものであることが分かります。その直後に fin- ger を実行すると、、、カレントホストがない " と表示して finger を実行しません。 意 7 finger を使うためには、その実行の直前に finger で調 , 、く たいホストの A レコードを本きしなければなりません。 finger の出力は、 ls コマンドと同しように > や > > を使 ってファイルに保存することができます。 ノンインタラクティフ・モード ノンインタラクテイプ・モードでは、コマンドの引数に 必要な情報をすべて指定し、それをもとにネームサーバー に問い合わせた結果をバするという処理をします。コマ 47
UN Ⅸへの招待 タは、シェルカ絲冬了するまで環竟変数となっています。も ちろん宣言のあと直を変えることもできます。また、値 を変えたとき、再度 export で宣言する必要もありませ ん。さらに、 Bourne シェルでは ( 前例の myman のよ うに ) 環境変数についても、コマンドの実彳学に 変数名 = 値コマンド のように設定したり値を変更できます。 なお、設定されている竟変数の一覧表示は、 print- env コマンドを使います。 dir: is read only readonly と旦言した変数に値を代入すると、シェルか らは ( 例に示した ) メッセージが表示され、値の代入は おこなわれません。 Bourne シェルの環境変数 最後に、 Bourne シェルの環境変数について説明しま しよう。 C シェルでは、環境変数は setenv コマンドを 用いて設疋します。一方 Bourne シェルでは、 1. キーワード・パラメータとして設定 おわりに 2. そのキーワード・パラメータを竟変数として旦言 今月は、 Bourne シェルのパラメータについて、キー というカ 1 去で設定します。 2 の作業には export という ワード・パラメータを中心に紹介しました。パラメータに 糸ムみコマンドを使います。次刎列を見てください。 ついては、まだまだたくさん説明しておかなければならな いことがあります。次回は、位置パラメータやパラメータ $ LANG=japanese の置換などをとりあげる予定です。では、 また。 $ export LANG ( さかもと・あや YDC) いった / レ竟変数として旦言したキーワード・パラメー SC 翡 UNIX MAGAZINE 好評連載中「 UN Ⅸへの招待」単行本化第 2 弾 坂本文・著 『続・たのしい UN Ⅸーシェルへの招待 1,900 円 シェルは、 UN Ⅸの世界のいわば「裏方さん」。その動きや仕組みを知 続・たのしい UN Ⅸ れば、 UN Ⅸがいっそう楽しく、便利に使えるようになります。本書は、 ひろく使われている C シェルを中心に、シェルの使い方から仕組みま ルべの招待 販本文著 で分かりやすく解説しています。前巻の『たのしい UNIX—-—-UNIX への招待』とあわせて、ぜひご一読ください。 [ 目次から ] 1 章 知っておきたいコマンド入力のコツ 2 章 シェルとプロセス似士組み 3 章 シェルの仕事 4 章 .login と . csh 「 c のサンプル 付録 C シェルの組込みコマンド、シェル変数、メタキャラクタ 株式会社アスキー 〒 107 ー 24 鯨都港区南青山 6 ー 1 ト ] スリーエフ南青山ピル出版営業部花 K03 ) 3486 ー 1977 ま 好評発売中 172 UNIX MAGAZINE 1993.9
文 : すこしだけ。最後にお会いしたのは、去年の冬かな ? サンフランシスコでだったと思う。 T さん : あら、 U ⅲ F 。 rum のときしゃない ? 今泉さんも いらしてたの ? 文 : ええ・・ 本当に、世間は狭いものです。まさかあの狭い公園のな かに、狭い UNIX 業界の、しかもごく身近なところでお 仕事をしていたママがいるとは思いもよりませんでした。 さいわい T さんは、私の連載のことは知らないようでし た ( そうですよねえ、旧姓のままで書いているんだから ) 。 しかし、そのうちどこかから、過去のまくらにしたためて きた数々の、、ゴランギョウ " がバレてしまうのではないか しら・・・・・・公園では、、よい妻、よいママ " を振る舞ってい るだけに、ちょっと心酒己になってしまいました。まあ、い くらネコをかぶっていたって、いっかは地が出るっても んですけどネ。 C シェルにおける変数 今回は、 Bourne シェルの変数についてご紹介します。 変数とは、なんらかの値を保存しておくための場所です。 Bourne シェルと C シェルの上罅交の意未も含めて、まず は C シェルの変数についてざっと復習しましよう ( 『続・ たのしい UNIX 』 3.1 節に田か解説してあります ) 。 C シェルでは、組込みコマンド set を使って、 set 変数名 = 値 というコマンド実行で、 す。また、 変数名 値を代入できま set 変数名 = ( 値 1 値 2 値 3 ... ) UNIX MAGAZINE 1993.9 の、いすれかの状態に至るま呆存されます。 ムの実行カ鮗了するなど ) ・ C シェルか終了する ( ログアウト、シェル・プログラ ・変数そのものを解除する ・同し名前の変数に新しい値を代入しなおす 変数にいったん代入した値は、 では、変数名に複数刎直カイに入できます。 IJN Ⅸへの招待⑩ シェル変数 C シェルには、次の 3 不頁の変数があります。 ・シェル変数 ・ユーサー定義の変数 環竟変数 シェル変数とは、 C シェルか動作するのに必要な変数 です。たとえば、シェルの仕事の 1 つであるコマンドの 検索 1 は、シェル変数 path の値を使っておこなわれま す。 path には、コマンドが置かれているディレクトリの パス名が、値として複数個代入されています。シェルは、 それらのディレクトリからコマンドの実行可能ファイル を捜しだしてくるわけです。 シェル変数のなかには、値をもたす変数を設定するだ けのものもあります。これらの変数は、次のようなコマ ンド実行で設定します。 set 変数名 シェルは、その変数の設定の有無により、ユーザーに 対して異なったサーピスを提供します。たとえば、シェル 変数 ignoreeof を設定すると、く CTRL-D 〉を入力して も ( シェルがそれをユーザーからのコマンド入力の終了と は解釈しなくなるため ) ログアウトできなくなります。ま た、シェル変数 filec を設定しておくと、シェルのファ イル名の補完機能力イ吏えるようになります ( 未設定時は使 用できません ) 。 ユーサー定義の変数 ューザー定義のシェル変数に話を移しましよう。ユー ザーは必要に応して、変数を設定したり変数に値を代入で きます。前述したように、変数の設定は、 set 変数名 で、変数への値の代入は、 set 変数名 = 値 あるいは、次のコマンドを実行します。 1 ューザーが入力したコマンドについて、実行可能ファイルを / bin 、 /usr/bin などのディレクトリから捜しだす仕事。 165
のコメントが指定されているとファイル中に書かれた 関数が使われていなくてもメッセージを出力しません。 だからといって、これらの関数について検査をおこなわ なくなるのではなく、プログラム中で実際に使われてい る関数のみが引数や戻り値の検査対象となります。 以前デバッガの解説をしたときに、デバッガからし か呼び出されない関数について説明したことがありま した ( 1992 年 11 月号 ) 。ここで定義する関数は、プロ グラムの一部なのですが、プログラム中から呼び出され ることはありません。このような関数を含むファイルを lint コマンドにかけると、やはり関数が使われていな いというメッセージが出力されてしまいます。そこで、 このようなプログラム中では使われない関数を 1 つの ファイルにまとめて定義し、そのファイルの先頭に / * LINTLIBRARY * / コメントを入れておくこともできま す。すると、この関数か呼び出すはかの関数について引 数の検査はおこなわれますが、関数カ呼び出されなくて もメッセージを出力しなくなります。コメントが示すラ イプラリという意味からはすこし外れますが、これもこ のコメントの正しい使い方の 1 つです。 / * VARARGSn * / 最後に残った / * VARARGSn * / というコメントは、 コメントの直後に定義されている関数について最初のれ 個の引数のみ検査をおこなうことを指定します。たとえ ば、 printf のような関数では、最初に文字へのポインタ 型の値がくることを除けはその後ろには何がくるか ( 何 もこないこともありうる ) は検査できません。このよう なときには、 / * VARARGSI * / とすると、 1 つ目の引数 は ( 文字へのポインタであることを ) 検査するが、それ 以降の引数については検査しないことを指定できます。 れの部分には、上の printf 関数の場合のように数字 を指定します。数字で指定した個数の引数には、通常の lint コマンドがおこなう検査が適用されます。したがっ て、ここで指定した数の引数がない場合にはメッセージ が出力されることになります。逆に、この数を超えてよ り多くの引数を指定した場合は、それらの引数の指定を 検査しないために lint コマンドはなんのメッセージも 出力しません。れを指定しなかった場合は、 0 が指定 されたものとみなされ検査すべき引数は 1 つもないも のとして処理がおこなわれます。また、 / * VARARGSO 154 * / と指定すると、マシンによってはすべての引数を検 査してしまうことがあるので注意してください。 / * NOSTRICT * / 、、このコメントは、次の式に対する厳密な型検査をお こなわないように指示するものです " と、 BSD 系の マニュアルには書いてありますが、同じマニュアルの BUGS の項目を読むとこのコメントは実現されていな いとも書いてあります。一方 SystemV 系のマニュアル には、このコメントに関する記述すらありません。どう やらこのコメントは実用ではないようです ( どうもお騒 がせしました ) 。 こで / * PRINTFLIKEn * / と お騒がせついでに / * SCANFLIKEn * / という 2 つのコメントも紹介して おきましよう。これらのコメントは、その名が示すよ うにそれぞれ printf や scanf などの関数のために準備 されているものです。さきはどの VARARGS と同様 に、指定した個数の引数については通常どおりの検査 をおこないます。さらに、指定した個数の最後の引数 を printf や scanf の最初の引数としてそれ以降の引数 を指定するフォーマットだと判断し、そのフォーマッ トに書かれている要求に従って引数の型と数を検査し ます。このように説明するととても便利そうなのです が、実際にはまだ実現されていないようです。しかし、 Sun の /usr/lib/lint/llib-lc ファイルを見ると、 printf や scanf などのためにこれらのコメントが使わ れているので、そう遠くないうちに使えるようになる 日がくるかもしれません。 BSD 系の lint この連載では、おもに Sun の lint コマンドについ て説明してきました。これは基本的には BSD 系の lint コマンドです。したがって、これまで紹介してきたもの ははとんどが、 BSD 系の lint コマンドに当てはまりま す。しかし、 BSD 系のⅱⅡ t コマンドと異なるオプショ ンもいくつかあります。たとえば、 —host={arch} —target={arch} などは、 Sun 特有のオプションです ( 1993 年 7 月号 ) 。 また、意外にも、 BSD 系の lint コマンドでは一 i オ UNIX MAGAZINE 1993.9
や、 while ( 1 ) { などを使って無限ループを作成できます。ループの終了 に break 文を使えはルーフ。以降の部分は実行されます が、 return 文や exit 関数などでループを抜けることも よくあります。その場合は、ループの後ろの文は実行さ れません。このようなときにも / * NOTREACHED * / コ メントが有効と考えられますが、しつは lint コマンド は自動的に無限ループを検出します。そのため、これ らのループの後ろにコメントを指定する必要はありま せん。 / * ARGSUSED * / このコメントは関数定義の直前に指定するもので、 そこで定義している関数の引数のなかに関数本体で使 われないものがあることを示すものです。 たとえば main 関数について考えてみましよう。こ れは環境とのインターフェイスをとる関数で、引数は整 数型の argc 、文字へのポインタの配列 ( またはポイン タ ) の argv および e Ⅱ vp となっています 2 。プログラ ム起動時に、コマンド行引数の数が argc に入れられ、 空白文字で区切られたコマンド行引数が argv に入れら れます。 envp には、環境変数の名前と値の組が = で区 切られて入れられています。これらの引数をすべて使う 必要はありませんが、 ・引数を使わない argc だけ argc と argv ・すべての引数を使う という 4 つの方法だけが許されています。 argv は 矼 gc 個の文字へのポインタの並びとなっていて、その 後ろには NULL ポインタカ咐けられています。そのた め、 argc を使わなくても argv だけで必要な処理すべ てをおこなうことも可能です。しかし、 argc を使わす に argv だけを使うという方法は許されていないので、 2 もちろん、これらの変数名は任意です。ここでは説明のために一・に 使われているような変数名を用いました。 UNIX MAGAZINE 1993.9 LJN Ⅸ流プロクラミング 35 argv を使う場合にはかならす argc も使う ( もしくは 言する ) ようにしなければなりません。 argv だけを使っていて argc を使わないプログラム を lint コマンドにかけると、、、関数 ma ⅲの引数である argc が使われていない " というメッセージが出力され ます。しかし、 argc 引数の宣言を取り除くことはでき ません。このような場合に登場するのが / * ARGSUSED * / コメントです。このコメントを main 関数定義の直 則に指定することで、 lint コマンドからメッセージの出 力はおこなわれなくなります。 main 関数を例にとって説明しましたが、関数のイ ンターフェイスを統一するために、使わない引数を官 言している関数などでもこのコメントが必要となりま す。たとえば Xt のコールバック・ルーチン 3 などがこ れにあたります。コールバック・ルーチンは、引数と して Widget 型の、 XtPointer 型の client-data や call ー data をとることが決められています 4 。もし を使う必要がないときは、どうすればよいのでしよう か。この場合にもやはり / * ARGSUSED * / コメントを 指定することで、この関数の引数のなかに使われない ものがあることを示す必要があります。 / * L 工 NTL 工 BRARY * / ライプラリのソースファイルを書いているときは、そ のファイル中に書かれている関数のなかに呼び出され ない関数があっても不思議ではありません。このよう なファイルを lint コマンドで検査すると、使われない 関数があるというメッセージが数多く出力されます。ラ イプラリのソースファイルを単独で lint コマンドにか けるのはあまり適切な方法ではなく、そのライプラリ を使うプログラムのソースファイルとともに検査する のが一般的でしよう。しかし、その場合でもライプラ リのすべての関数を使うことはますなく、定義されて いるが使われない関数がどうしても存在することにな ります。 こんなときには、 / * LINTLIBRARY * / コメントを ファイルの先頭に指定して、そのファイルがライプラ リのソースであることを示します。 lint コマンドは、 3 4 Xt のコールバック・ルーチンとは、簡単にいうとライプラリのなか から呼び出されることが分かっている関数で、その引数の型や数カ鴃 まっているものです。 この場合も変数名は任意です。 153