連載 / / Li 社 Language—O 図 1 finger コマンドを socket で表現した例 $ echo ' /W ' ー socket verbosa finger Login name : kdaemon ln real life : Daemon Kogure Directory : /u/kdaemon She11 : /bin/ksh On since Ju1 15 02 : 10 : 10 on ttyp2 from bakufu:0.0 3 days 19 hours ldle Time No unread mail No P1an. 図 2 socket でメーリンクリストの工イリアスの内容を得るとき」 $ echo 'vrfy foobarlist quit ' ー socket pepper smtp 図 3 221 250 250 220 socket で nntpd を介してニュースグループ覧を得るとき」 pepper. f00. com CIOSing connection く liora@bryant> 250ーくmacklem@verbosa> 250ーく zombee@bryant> ーて 00t pepper く root > pepper. f00. com Sendmai1 4.1 ready at Tue, 20 Jul 93 09 : 56 : 18 GMT 250 hansen. f00. com He110 1—am—a—man (verbosa) , pleased to meet you helo l—am—a—man 220 hansen. f00. com Sendmai1 4.1 ready at Tue, 20 Ju1 93 10 : 08 : 13 GMT $ socket hansen smtp 図 4 socket を会話的に禾堋するとき」 205 lupine. f00. com closing connection. Goodbye . fj ・ unix. wizards 0000000005 0000000006 y fj . unix 0000000166 0000000165 y fj ・ genenal 0000000166 0000000140 m 200 lupine. f00. com InterNetNews NNRP server 1 . 2 ready (posting (k) . quit ' ー socket lupine nntp $ echo 'list W 0 are you? 500 Command unrecognized goodbye 500 Command unrecognized 421 hansen. f00. com Lost input channel to verbosa ネットワーク・サービスへの TCP 全二重コネクション を提供します。 socket ん OSt れ 07 れ e socket コマンドは、自分の標準入力を読んでそれをリ モート・プログラムに渡し、同時にリモート・プログラム から送られてきたデータを標準出力に送り出します。 socket コマンドと組み合わせて利用できるリモート・ プログラムは、 NNTP や SMTP のような単純なテキス ト形式のインターフェイスをもつものが適しているでしょ う。残念なことですが、元来シェル・スクリプトはダイア ログ ( 会言乱勺なやりとり ) を記することが不得意なので、 80 パイフ。や制徊構造を組み合わせたシェル・スクリプトの一 部として socket コマンドを利用すると、リモートサーピ スは一種のフィルタのようにしか扱えません 1 。 ためしに finger コマンドを socket コマンドで表現す ると、図 1 のようになります。 socket コマンドは、リモートシステムの fingerd に文 字列 /W を送って、 fingerd カ亟す結果を表示します。 1 この問題をかっこよく夬するな去として、、イベントループ " を内部に もって、 case 構文にイ以たやり方でダイアログを・見するように socket コ マンドを搦長することカ考えられます。その場合 socket コマンドを、コ プロセス " として扱うことのできる Korn Shell のような信曲けと組み合 わせると、かなり hack value のあるシェル・プログラミングが可能な はすてす。 UNIX MAGAZINE 1993.9
AUC TEX 図 1 TeX-lisp-directory の言例 (defvar TeX—1isp—directory "/usr/local/lib/emacs/local/auctex/" "*The directory where the AUC TeX lisp files are located. ↑ The directory name *must* end with a slash. " ) 図 2 TeX-macro-global の言聢例 (defvar TeX—macro—g10ba1 ディレクトリ名の末尾に かならす / を付ける ' ("/usr/local/lib/tex/macros/" "/usr/local/lib/tex/styles/") "*Directories containing the sites TeX macro files and sty1e files. The directory names *must* end with a s1ash. " ) 図 3 TeX-command-list の例 ( 一部 ) (list "jTeX" "aJtex '\\nonstopmode\\input %t , " ) TeX—TeX—hook nil t) (list "jLaTeX" "ajlatex '\\nonstopmode\\input{%t}' " 'TeX—LaTeX—h00k nil t) (list "jS1iTeX" "ajslitex '\\nonstopmode\\input{%t}' 'TeX—LaTeX—hook nil t) TeX-1isp-directory は、 AUC をインストー ルするディレクトリ名です。 Emacs Lisp ファイルを格 納しているディレクトリの下に auctex などの名前のサ プディレクトリを作り、そこにインストールするといいで しよう。ディレクトリ名の末尾には、かならす / ( ス ラッシュ ) を付けます。たとえば、サイト独自の Emacs Lisp を /usr/local/lib/emacs/local に置いている 場合は、図 1 のようにします。 このディレクトリがなければインストール時に自動的 に作成されますが、すくなくとも 1 つ上のディレクトリ ( 図 1 の例では /usr/local/lib/emacs/local) は既 存のものでなければいけません。 TeX-macro-g10ba1 は、そのサイトでのマクロ がインストールされているディレクトリ名のリストです。 これらのディレクトリ名の末尾にも / を付けておく必要 があります。たとえば、マクロが /usr/local/lib/tex /macros と /usr/local/lib/tex/styles にインスト ールされているところでは図 2 のようにします。 TeX-fast は、通常は nil にしておきます。遅いマシ ンでは、これを nil 以外に設定すれば、 AUC の機 能の一部を省略して重川乍を速くすることができます。しか し、これはいくつかの変数のデフォルトの設定を変更して いるだけなので、チューンナッフ。が目的ならそれらの変数 110 表 2 コマンド文字列で使用可能な % 工スケープ 記号 %s %d 意味 ューサーに問い合わせて得たプリンタ名のプリン フ。シ - ョン 文書のスタイルに応した適切なプレピューア・オ 処理中のファイル名刻長子 dvi) 処理中のファイル名長子 tex) 処理中のファイル名付長子なし ) タに対応するプリントコマンド を直接設定したはうがいいでしよう。 TeX—print—command 、 TeX—view—command 、 TeX— command-list 、 TeX—printer—1ist の 4 つの変数で は、 AUC 。から起動けるコマンドに関する設定をおこ ないます。 tex-site. el ではこの順に並んでいますが、 こではすこし順番を入れ替えて説明します。これらの変 数のなかでコマンド文字列を与える部分では、表 2 に示 す % ェスケーフ。が使えます。 TeX-command-1ist では、 AUC から起動する外 部コマンドについての各種の設定をおこないます。日本語 rIbX を起重力するコマンド名が jtex 、 jlatex 、 jslitex ではないときは、これらを適切なコマンド名に置き換え てください。たとえば、コマンド名がそれぞれ ajtex 、 ajlatex 、 ajslitex の場合、図 3 の下線部のように変 更します。 UNIX MAGAZINE 1993.9
ミング 35 実彳」 % cat 1 2 3 4 6 8 10 12 { 13 14 } ーⅡ . C 11 main() double 5 sub(d) int extern int b ; d; return d return sub (b) ; % /usr/bin/lint ex-u. c sub, arg ・ 1 used inconsistently ex—u. c(7) a defined( ex—u. c ( 1 ) ) , but never used b used( ex—u. c ( 13 ) ) , but not defined % /usr/bin/lint —u ex-u. c sub, arg ・ 1 used inconsistently ex—u. c(7) % /usr/5bin/1int ex—u. c name used but not defined ex—u. c ( 13 ) name defined but never used ex-u. c(l) IJN Ⅸ流プログラ ex—u. C(13) ex-u . C(13) function argument ( number ) used inconsistently sub ( arg 1 ) ex-u. c(7) ex—u. C(13) % /usr/5bin/1int ーⅡ ex-u. c function argument ( number ) used inconsistently UNIX MAGAZINE 1993.9 に分かるようにキャストやコメントを入れると、はか ログラムを書くことはとても大変ですが、 lint コマンド でしよう。 lint コマンドにメッセージを出させないプ が、潜在的なバグをみつけるにはかなり有効なツール メッセージも多く使いにくいと感じるかもしれません ついて説明しました。ⅱ nt コマンドは、ふだん使うには ント、 BSD 系や SystemV 系の lint コマンドなどに 今回は lint コマンドの最終回として、 lint 用のコメ 注意してください。 方の lint を使うことができる恵まれた環境にいる人は、 セージしかファイルに組み込むことができません。両 出力を渡してしまうと、正しく整形できすに一部のメッ 由でこのプログラムに System V 系の lint コマンドの ex—u. C(13) ex-u. c(7) sub ( arg 1 ) の人力ワ。ログラムを読むときに重要な情報となること だけは憶えておいてください。 さて、次回からは RCS について紹介する予定です。 RCS は、プログラムの開発を進めていくなかでソース ファイルのバージョン管理をするツールです。プログ ラムの書き方に関する話題ではありませんが、プログ ラマーとしては重要なテーマだと思います。 ( いまいすみ・たかし東京工業大学 ) 157
プションを指定できません ( もちろん、ともに用いる ー。オプションも使えません ) 。このため、ソースファ イル中の誤りを検出するのに複数のソースファイルを 別々に lint コマンドにかけてから、ソースファイル間 の誤りの確認のためにまとめて lint コマンドにかけな おすという竹喋が ( 中間ファイルを使っては ) おこなえ ません。中間ファイルを使わなければ、ます個別に lint コマンドにかけるときに -u オプションを指定し、次に すべてのソースファイルをまとめて一 u オプションを付 けすに処理する方法が考えられます。しかしこの方法で は、それぞれのファイルに関する検査が二重におこなわ れるので、なんとなくコンピュータ資源をむだ遣いして いるような気がします。 さいわいにもⅱ 11t コマンドの多くは、シェル・スク リプトとして実現されています。このシェル・スクリプ トはとても簡単なものなので、自分のディレクトリにコ ピーして自分用の lint コマンドを作ることができるで しよう。前回も説明しましたが、 lint コマンドは、 lintl と Iint2 というプログラムに対して適当な引数を設定し ながら処理します。じつはこの lintl プログラムからの 出力が、一 i オプションを与えたときに得られるものな のです。この出力から得られたファイルは、あとではか のファイルとともに Iint2 プログラムにかけられ、ファ イル間での誤りがないかどうかか検査されます。これさ え分かってしまえは、 lintl や lint2 の細かなオプショ ンの意味が分からなくてもこのシェル・スクリプトを編 集することができます。皆さんぜひ一度挑戦してみてく ださい。シェル・スクリプトを書く練習にもなると思い ます。この連載でも以前説明したことのある、 ・オプションの解析方法 ・中間ファイルの作り方 ・ファイルの後始末 などの技法も使われています。せつかく作るのならば、 前回説明した lint コマンドに一 L オプションを加える方 法も検討してみてはいかがでしようか。 BSD 系の lint コマンドで Sun とのもう 1 つの違 いは、一 q オプションです。これは、 sun どうしで移植 性のあるものに関してはメッセージを出力しないよう にするものでした。このオプションも Sun に特有で、 BSD 系の lint コマンドにはありません。 UNIX MAGAZINE 1993.9 SUWHP ワークステーション用 拡モリー -Window ターミナル PI 0 シリーズ限定 50 台 [ 8MB メモリー、マウス、キーボード、 10Base5 ・ 2 ・ T 対応 ] アカテミックキャンペーン実施中 “応援しま魂研究室 ! ! ” •SPARC classic ・ LX 8 、 32MB •SPARC station 10 16 、 64MB •SPARC station 2 ・ 1 ・ 1 十ヨ PC 16MB •SPARC station 33 ・ 70 ・ 390 32MB •SPARC se 「 ver 60 256MB ・ 3 / 60 ・ 3 / 80 ・ SPA 日 C atio •SPARC station L EPARC statio L ■ DN5500 ■ DN3010A ・ 0 ・ APOLLO ■ 4 / 110 16MB ■ 3 / 260 ・ 280 ・ 470 ・ 4 / ・ 4 / 470 ・ 4 / 490 32 、 1 C B 4 、 8MB 32 3 / 000 00 4 、 8M 日 E H P) ■ HP9000 / X 8 、 1 、 32 〃 50 64MB ■ HP900 •MA ・ N e c 4 16 、 82MB S NeXT B K ・ QIJADRA Sta i n •NEWS 721 ・ 1 1500 4MB •NEWS 1600 ・ 1700 ・ 3460 4MB •NEWS 3260 ・ 3470 16MB •SIJN/SPARC station 対応 520MB ~ •MACINTOSH 対応 213M 日 ~ •SONY/NEWS 対応 24 ロ MB ~ ・ HP9000 / 400 ・ 700 対応 218M B— ◎光磁気旧 mm , DAT バックアップシステム 拡張メモリー ハードティスク 1 . ロ 5GB ~ DAT バックアップシステム SUNWS についてもお見積りします。 ※記載されている会社名または製品名は、各社の商標または登録商標です。 ※アフターケアには万全を期しております。 ・お気軽にお問い合せ下さい。 信頼と実績の電子機器商社 Est.1 955 宝商式織甎 〒 103 東京都中央区日本橋 3 ー 13 ーⅢ油脂工業会館 ) 営業第 2 部担当 / 須賀 TEL(03) 3274 ー 2433 FAX ( 03 ) 327 ト 8023 ノトドティスク及び周辺機器 旧 M RS / 6000 対応 155
連載 / Li 社 Language—O 値 2 これ以降ソケットはデータを送らす、受け取りもし ないことを通知する。プログラムか緊急に終了する場合 にのみ有用。 リスト 1 の socket コマンドでは、 106 ~ 129 行目にか けて、 select ループとソケットの shutdown 操作がコー ディングされています。 今回紹介した socket コマンドにはオリジナルがありま す。 1992 年 9 月に comp. sources. unix にホストされた ものです 2 。 srekcah は、自竹ワ。ログラムのデバッグッールとしてお あつらえ向きだったこの comp. sources. unix ) 阪 socket コマンド ( 以下、 csu 版と略) をみつけて、アーカイプか ら拾いあげてきました。ところが、デバッグ竹業にとりか かってしばらくすると、プログラムの動きに釈然としない ものを感しました。そこで、おかしいのははたして自作プ ログラムなのか、それとも csu 版 socket コマンドなのか を調査したところ、後者のコネクション終了手順に疑わし い点があることか分かりました。 csu 版の socket コマンドは、ネットワーク・サーピ スを要求するクライアントとしてだけではなく、サービス 自体を提供するサーバーとしても機能できるようになって います。コマンドは指定されたポートに関してソケットを passive open して接続要求を待ち、クライアントがあれ は・ stdin と stdout 、 stderr をソケットにつないで、任意 のシェル・スクリプトを呼び出すのです。またこのほかに も、 NET-ASCII 形式テキストを自動変換するオプショ ン (lnternet ではテキスト行末は \ r \ Ⅱか驃準 ) や、サー バーモードでの子プロセスの振舞いを指定するオプション があるなど、 csu 版 socket の内自購造はかなり複雑になっ ています。 そこで、実装にいまひとつ断昇のいかない csu 版の修正 2 Newsgroups : COmp . . UnIX Subject : V26i075 : socket shell—level interface to IP/TCP sockets Date: We, 9 Sep 92 18 : 32 : 26 GMT Submitted-By: nickel@cs . tu—berlin. de (Juegen Niche1sen) Posting-Number : V01ume 26 , lssue 75 Archive—Name . socket おわりに 84 は試みす、自分で作りなおすことにしました。 srekcah に しては珍しく、 C プログラミングに手を染めたわけです。 けれども、機能豊富な csu 版 socket とコンパチプルにす る努力は怠ってしまいました。もとはといえは、自竹ワ。ロ グラムをデバッグするためのツールなので、自分の要求に 見合ったものになった瞬間に改良への熱意を失ってしまっ たのです。 とはいえ、このユーサーレベル socket コマンドは、ク ライアント機能だけではあまりにも寂しく感じられます。 サーバー機能、すなわちシェル・スクリプトと自在に組み 合わせて、新たなネットワーク・サーピスを手軽に提供で きる手段がどうしても欲しくなります。 C に代わることが できて、 UNIX 流のネットワーク・プログラミングが可 能な言語が、現点では Perl くらいしか考えられないと は、よく考えてみると改善されるべきゅゆしき事態といっ ていいかもしれません。ウインドウ・アプリケーション のプログラミング手法も、けっきよくのところ ( 広義の ? ) UNIX 流シェル・スクリプトに回帰しようとするトレン ドが垣間見えるいま、データと制御の構造化に関する新た な発想を簡潔なシンタックスで表現できるような、うまい やり方か望まれているように思います 3 。 閑言刮木題。 srekcah は、サーバーモード socket には 標準シェル・スクリプトを socket コマンド内部から呼 び出すだけでなく、サーバーの振舞いを条件付きで切り替 える簡単な系Ⅲムみスクリプト言語が備わっていれば、ます ます便利に使えるはすだというところまでは考えました。 syslog インターフェイスも忘れすに追加したい・・ もやつばり srekcah は基本的に lazy なプログラマーなの で、思いついたところて大あくび一発、アイデアはそのま まに放ってあります。本盖売者の改良への餓に期待しま す。それでは Happy Hacking! 3 近ごろはなんでもかでも GUI 化ということで、巷ではウインドウ・ア プリケーションが大繁盛しているようですが、プログラミンク冓造という か、手法ク攵善という点では、過去数年間にわたってまったく停滞しきっ ているの ( 英かわしいかぎりです。ことウインドウ・アプリケーションに 関しては、 Macintosh や DR GEM の日にから何も進化していませ ん。 UNIX MAGAZINE 1993.9
AUC TEX—① 図 4 プリンタの例 (defvar TeX—printer—Iist , (("Fi1e" "dvi2ps %s > %s. ps") (defvar TeX-print—command "dvi2ps %s ー lpr -p%p" "*Command used to print a file . First %p is expanded tO the printer name , then ordinary expansion is performed as specified in TeX—expand—1ist . " ) 図 5 TeX-view-command の例 (defvar TeX—view-command "xdvi %v %s" "*Command used tO view a fi1e . Changes after tex—site. el is loaded has no effect NTT . Ⅱとアスキー日本語 rIbX を共存させている 環境では、とりあえすどちらかを選んで設定してください ( 詳細は次回以降に説明します ) 。 必要なら、 jbibtex のコマンド名も変更します。 TeX-printer-1ist は、 . dvi ファイルを印刷するコ マンドを設定するためのリストです。各要素は、プリンタ 名とそれに対応するコマンド文字列です。コマンド文字列 を省略すると TeX-print-command の値になります。 れらのコマンド文字列では、 %p は表 2 に示したものとは 異なり、プリンタ名に展開されます。 tex-site. el の設定例からも分かるように 刷 " はプリンタ出力を対象としたものとはかぎりません。 PostScript ファイルへの変換なども、印刷 " として取 り扱うことができます。たとえば、 lp 、 1 ps という PostScript プリンタがあり、 dvi2ps で PostScript に 変換しているサイトでは、図 4 のように設定します。 TeX—view—command は、 . dvi ファイノレのプレビュー に使うコマンドです。たとえは、プレビューアとして xdvi を利用しているサイトでは、図 5 のようにします。デフォ ルトの設疋もこれと同じです。 %v は文書のスタイルに応してオプションを変更する 引数で、プレピューアとして xdvi を利用していると きはそのまま使えます。これ以外のプレピューアの場合 は TeX-view-sty1e の設定を変更する必要があります。 TeX-japanese-process-input-coding-system と TeX-process-kanj i-code は、の処理系など UNIX MAGAZINE 1993.9 から出力を受け取るときの漢字コードを設定する変数で す。 Mule を使用している場合は TeX-japanese-pro- cess-input-coding-system を、 Nemacs を使用して いる場合は TeX-process-kanji-code を設疋します。 もちろん、両者を適切に設定すれば Mule と Nemacs で 共用できます。 TeX—japanese—process—output—coding—system は、 AUC から外部コマンドのプロセスにデータを 送るときに使う漢字コードを設定する変数です。ただし、 現在の AUC rIbX はプロセスに直接データを送らないの で、この変数はなんの景彡響もおよは、しません 4 。とくに理 由がなければ、 TeX-japanese—process-input—cod— ing-system と同しにしておけばよいでしよう。図 6 に すべての漢字コードにシフト JIS を指定した例を示しま す。 Makefile Makefi1e では、インストール先のディレクトリな どを設定します。各サイトの設定に合わせて、 bindir 、 infodir 、 mandir を書き換えます。 elispdir は、標 準の EmacsLisp がインストールされているディレクト リに設定します。 aucdir は、 AUC rIbX をインストールするディレク トリです。かならず、 tex-site. el の TeX-1isp-di- 4 とはいっても、 Mule か識する漢字コード (coding-system) でな けオ・ u まなりません。 111
また、メーリングリストのェイリアスの内容を得るに は、 sendmail と直接会話する簡単なスクリプトを送り込 んでやれはいいことになります ( 図 2 ) 。 同様に、 nntpd を介してリモートシステムか管理する ニュースグループの一覧を得るときは、図 3 のようにしま す。また、 socket コマンドは会言乱勺に利用することも可 能です ( 図 4 ) 。 会話的に利用するときには、セッションの終了は行頭 の Ctrl-D で指示します。これは通常の UNIX コマンド への入力終了通知と同しルールになっています。 socket コマンドは、任意のネットワーク・サービスを シェル・スクリプト内部から利用するのに便利な f 廱トけを 提供します。たとえば、ネットワークを介して利用する データベース・サーバーがどこかにあるとしましよう。毎 夜決められた日リに at ( 1 ) の助けを借りてシェル・スクリ プトが、その日のシステム活重垢己録を統言 t 処理してデータ べース・サーバーに送り、返ってきた結果をどこかにセー プする、というような目的に s 。 cket コマンドは応用でき ます。 socket の内部構造 socket コマンドのソースコードをリスト 1 に示します。 標準的な UNIX 流ネットワーク・プログラミング手法の 本咎Ⅲこ沿った構造が分かると思います。 socket コマンドの実装には、解説が必要な箇戸励ゞいく つかあります。ネットワーク・プログラムの急所を衝く ような話題なので、すこし掘り下げてみることにしましょ connect はいつタイムアウトするの ? TCP コネクションの active open 側 ( いわゆるクラ イアント ) は、 connect システムコールを発行し、その完 了を待ってプロックします。 c 。Ⅱ nect はリモートシステ ムの孑日疋ポートで、 passive 叩 en 側 ( サーバープログラ ム ) か待ち受けていれば、 TCP コネクションを確立しソ ケットを全二重通信可能に整えて、制御をプログラムに返 連載 / ・ / 凵社 Language—O UNIX MAGAZINE 1993.9 かったら何カ起こるのでしようか ? では、リモートシステムの当該ポートで誰も待っていな します。 この場合、リモート システムからは ICMP port unreachable メッセージが 送られてきて、 connect システムコーノレはイ直ー 1 と errno ECONNREFUSED をプログラムに返します。 では、リモートシステムにたどり着けなかったらどうな るのでしようか ? 至撻不可能の理由が IP ルーティングの 設定にあるのならば、運よく誰かが ICMP network un- reachable 、あるいは host unreachable メッセージを送 り返してくれるかもしれません。そのときには、 connect は値ー 1 と ENETUNREACH あるいは EHOSTUN- REACH を返します。 でも、たまたまそのリモートシステムがダウンしていた り、もとから存在しないものだったら、 connect は TCP メカニズム内部に実装されたタイムアウト時間か経過する までプロックし続け ( 制脚を呼出し側に返さず、プログラ ムは停止する ) 、そのあとで値ー 1 と errno ETIMED- OUT をプログラムに返します。 こに問題があります。 プログラムは、タイムアウト発生までの時間の最大経過 時間長を connect システムコールに指定できないので、 タイムアウト発生までどれだけ待たされるか分からないの です。 この問題を解決するために、 srekcah はこの socket コ マンドにアラームを仕掛けておき、指定時間か茴しても connect カ鮗了しなかったら、プログラムを強制了する というガ去をとりました ( 末尾のコラム参照 ) 。 ソケットってどうやってクローズするの ? これは、別な疑問、、 shutdown システムコールっていっ たいどう使うの ? " と密接にかかわっていて、ネットワー ク・プログラミングの根本的な難しさを内包しています。 節を改めて解説しましよう。 行儀のよいプロセス間通信終了法 ネットワーク・プログラミングにおいて、 EOF (End Of FiIe) をどのように判断し、どうやって相手に伝える かは、一筋縄ではいかない厄介な問題です。 ためしに、 UNIX マシンで netstat -a を実行してみ てください。最後のフィールドに、 FIN-WAIT-? なにがし と表示されているエントリがいくっかありませんか ? これ らは、プログラムカ鮗了しかけているのに、成仏しきれな 81
図 7 /var/spool/mqueue の中身 banana# ls -lg /var/spool/mqueue 16 : 39 SAV/ 14 : 21 3201 Fri Ju1 16 09 : 37 く foo@astec drwxr—sr—x 2 1 1 1 1 1 1 2 1 2 root root root root て 00t て 00t て 00t て 00t て 00t て 00t staff staff staff staff staff staff staff staff staff staff 29696 Ju1 844 Ju1 801 952 Ju1 952 Ju1 1237 Ju1 51 629 Ju1 640 Ju1 Ju1 Ju1 0 Ju1 16 13 16 19 19 19 19 19 13 : 05 dfAA01572 17 : 00 dfAA09742 16 08 : 55 dfAA10308 14 : 12 dfAA15051 ・ 18 qfAA01572 14 : 20 qfAA09742 14 : 20 qfAA10308 14 : 13 qfAA15051 14. 19 XfAA15051 図 8 mailq の実イ」 Mai1 Queue ( 554 requests) AA12670 AA10308 AA13915 —Size— 51 —Q—Time— (Deferred: Fri Ju1 16 (Deferred: (Deferred: —Sender/Recipient— ・ CO ・ jp> Connection refused by[creamy. ics. es. osaka—u. ac ・ jp) くbar@ascii ・ co ・ jp> 08 : 55 root@naniwa—u ・ ac ・ JP Connection timed out during user open mailserv. naniwa—u. ・ JP) avis@mutt . cs. mcgi11. ca 1619 Wed Ju1 14 14 : 40 hoge@ise . osaka-u. ac ・ JP Host Name L00kup Fai1ure) hoi@camp ・ naniwa—u ・ ac ・ JP 詰まってへん ? 32 7 このディレクトリは、 - ・ヨ殳ューサーは覗けないこともあります。 mailq のマニュアルは sendmail を読むことになります。 か呼はれた名前によって働きを変えています。ですから、 のコマンドの実体は sendmail であり、 1 つのプログラム メールの状態を詳しく調べるコマンドが mailq です。 を覗けば分かりますが、原因は分かりません。未配送の 出ていかないメールがあるのは /var/spool/mqueue mailq コマンド ルが残ります 7 ( 図 7 ) 。 かった場合、このディレクトリにメールに対応するファイ 出されると消えてしまいます。障害のために送り出されな トリにファイルとして置かれます。このファイルは送り るとき、一日判勺に /var/spool/mqueue というディレク メールは、送信側のワークステーションから送り出され やろ」 るなあ。なんとかして送りたいけど、どうしたらええん 「ありゃ ? メールがちゃんと出てないんとちゃうか ? 困 mailq コマンドは、 /var/spool/mqueue のファイル をみて、 ・メールキューに入っているファイル名 ・メールファイルの大きさ ・キューに入れられた日時 ・送信者・受信者 ・メールが送られていない理由 を表示してくれます ( 図 8 ) 。 メールが送られなかった原因 mailq コマンドで残っているメールの確認ができたら、 なぜ送られなかったのか調べなければなりません。 mailq の例を図 8 に挙げます。この例では、それぞれ異なる理由 で残っていることが分かります。 1. Connection refused ターゲットになる計算機が通信要求を手色したときに出 ます。通常、ターゲット側で準備されていないサーピス にの場合はメール醋医サーピス (SMTP)) に通信要求 UNIX MAGAZINE 1993.9
IJN Ⅸへの招待 図 1 シェル・プログラム実彳にするキーワード・パラメータ $ myman ls man $ * # ! /bin/sh $ cat myman 」 apanese $ echo $LANG LS(IV) 名前 ls USER COMMANDS ディレクトリの内容の表示 $ LANG= myman ls LS(IV) NAME ls JLE USER COMMANDS list the contents Of a directory 竟変数 LANG を設定していなくても、 ルが表示できます。 LANG=japanese myman コマンド名 日本語のマニュア また、ログインシェルに環境変数 LANG か設定してあ り、通常は日本語のマニュアルが表示されるようになっ ている場合でも、次のように実行すれは英語のマニュア ルを表示できます。 LANG= myman コマンド名 つまり、 変数名 = では変数名の値が NULL に再設定されるので、 LANG= とすると LANG が NULL になるからです。 Bourne シェ ルではキーワード・パラメータと環境変数は、ログイン UNIX MAGAZINE 1993.9 LS (IV) LS (IV) Bourne シェルでは、いったん成疋した変数を、読取 読取り専用のキーワード・パラメータ ログラムの夫彳こ値の代入や設定かできるのです。 境変数もキーワード・パラメータと同様に、シェル・プ シェルでまったく同しように扱えます。したがって、環 ルの系囚みコマンド readonly を使います。次のように 供されていない機能です ) 。このためには、 Bourne シェ り専用にすることができますにれは、 C シェルでは提 $ dir=/usr/home/yu-suke readonly home readonly dir $ readonly $ readonly home $ readonly dir $ dir=/usr/home/aya されます。 引数なしで実行すると読取り専用の変数の一覧が表示 readonly 変数名 実行すると、変数名か第翹 ( り専用になります。 171
ennacs 入門 //へ、 / 図 7 * Comp 厄 tion * / ヾッフアに表示するエンコーディングの一覧 表 5 コード系を変更するコマンド (Mule) キー入力コードの変更 set—keyboard—coding¯system ディスプレイコードの変史 —default—process—coding—system —current—process—coding—system ードの変更 —default—file—coding¯system file—coding—system ードの変更 -display-coding-system set set プロセスコ set s et ー ファイルコ set Display¯coding—system: です。指定できる文字コードの不頁を知りたければ、 l)isplay¯coding¯system : *euc¯J apall* 。たとえば、日本語の EUC コードの場合は、 と表示されるので、文字コードを表す値を指定してくださ Disp1ay—coding¯system : を実行します。工コー行に M—x set—display¯coding¯system UNIX MAGAZINE 1993.9 アのファイルコードを特定のコードに設定します。ためし ノヾッ - フ tem です。 MuIe ではファイルを読み込むときに もう 1 つのコマンドは、 set-default-file-coding-sys- 明は省略します。 display-coding-system と同し働き、同し操作なので、説 ing-system です。このコマンドは、すでに説明した set- ントバッフアのファイルコードを変更する set-file-cod- ードを設定するコマンドは 2 種類あります。 1 つは、カレ 次はファイルコードの説明に移りましよう。ファイルコ ありませんね。 定するときも同じ操作をおこなうので、もう説明の必要は な文字コードを選んで入力するだけ。キー入力コードを指 で扱える文字コードの一覧が表示されます。あとは、適当 バッフアが現れて、図 7 に示したような現在のバージョン の状態で、く SPC 〉キーを叩いてください。 * Completion* Possib1e completions are : *aUtOCOIIV* *big5—eten—dos* *big5—hku—dos* *euc—china* *eUC—kOrea* * iso ー 2022 ー kr * * iso ー 2022 ー ss2 ー 7 * *junet* *SJiS* nil *big5—eten* *big5—hku* *ctext* *euc—japan* * iso ー 2022 ー lock * * iso ー 2022 ー ss2 ー 8 * *korean—mail* *01djis* *SJis—dos* に何も設定しない状態で新しいファイルを読み込んでみ てください。モード行には、 と表示され、 * junet * コードになっていることが分かるで しよう。新しくバッフアを作ったときには、つねに * junet * コードが設定されてしまいます。もし、 「自分のファイルはすべて日本語 EUC で管理している」 という場合は、ファイルを保存する前にバッファごとに set-file-coding-system コマンドでカレントノヾッフアの ファイルコードを変更しなけれはなりません。 これは不便なだけでなく、ちょっと気を抜くと *junet* コードでそのまま保存してしまいかねないので、危険でも あります。もし、 * junet * 以外の文字コードを頻繁に使う 場合には、 M—x set—default—file—coding—system を実行してください。設定方法は set-file-coding-sys- tem とまったく同じです。 ためしに、 *euc-japan* を設定してみましよう。 M—x set—default-file—coding—system Defau1t file—coding—system: *euc—Japan* 既存のバッフアのファイルコードを調べてみても、どの バッフアもとくに変更されている様子はありません。それ では、新たにファイルを読み込んだり、新規にバッフアを 作成したときのファイルコードはどうなるでしよう。 Find file : NewFi1e M—x find—file 141