連載 / Li 眈 Language— elsif ($command eq 'cat' Ⅱ $command eq 'extract ' ) { $print—header = $print—body = &pickit ($name) ; elsif ($command eq 'edit') { 0 if ($header [$linkflag-i] $catit $catall Ⅱ $cat{$name}; $catit $print—header = $print-body = 0 ; if ($header[$linkflag—i] &edit($header [$linkname_i] ) $header [$linkname-i] $header [$name-i] = &edit ($header[$name-i] ) ; $header = &make—header (@header) ; $print-header = $print-body = 0 if print $header if $print_header ; if ($catit & & $command eq 'extract ' ) { open(OUT, ” > $ Ⅱ e " ) Ⅱ warn("$name: se1ect(OUT) ; $bufsize = 8192 ; oct ($header[$size-i] ) ; $Size ($header[$name-i] = ~ た \ 0 / ) ; $size = 0 if ($header[$linkflag-i] while ($size > 0 ) { $bufsize 512 if ($size く $bufsize); if (($s read(TAR, $buf , $bufsize) ) ! = $bufsize) { $bufsize, size $size, s = $s\n" if $opt-d; print "bufsize die ”工 llegal EOF! \ Ⅱ " print substr($buf, 0 , $size) if $catit; print $buf if $print-body ; $size $bufsize; exit if ($catit & & ! ——$cat—cnt) ; if ($catit & & $command eq 'extract ' ) { select (STDOUT) ; c10se(OUT) ; c10se(TAR) ; exit(O) ; sub usage { print $usage ; exit 1 ; ; # make header bIOCk by reculculating checksum sub make—header { 10Ca1 (@header , $header) $header = pack ($header—format , @header [ 0..5 ] , $header [ 6 ] sprintf ( " % 60 \ 0 " , unpack("%16C*" pack ($header—format , @header) ; ・ # parse header block sub parse—header { 10Ca1 ()h ) = ー $h[$name-i] $h[$linkname-i] for ( 2 .. 6 ) { UNIX MAGAZINE 1991.12 x 8 , @header [ 7..9 ] ) ; $header) ) ; 93
連載 / Li 眈 Language— $cdr; if (index($opts, $car) > = $ D { &usage ( "Unknown option : $car\n\n" ) ; redO ; $command = shift Ⅱ $tarfile = shift Ⅱ command : { s age ; # lst argument is command # 2 れ d argument is archive file if if if if if if ($command eq 1ast ; ($command eq @patterns = , list , ) { 'pick' Ⅱ $command eq @ARGV; for (@patterns) { &wildcard($-) ; ($command , $negative) ('pick' , throw' ) { , ! ) ) if ($command eq ー ; $negative ( / " 'extract' ) { ' throw ' ) ; $sub = "sub pickit { print STDERR $sub if &eval ($sub) ; 1ast ; ($command eq 'cat' Ⅱ $catall + + if (@ARGV for (@ARGV) { $cat_cnt 十十 ; 1ast ; ($command eq 'edit' ) { local(\$-) @patterns) $opt-d; $command eq $script ($command $script $command shift ; $command ; 'edit ' ・ ($command eq 'edit' ) { print STDERR $sub—edit if $opt-d ; &eval($sub—edit) ; $sub—edit "sub edit { 10Ca1 ( \ $ ー ) = \@ー else { print "IJnkown command : $command\n" ・ &usage ; open(TAR, $tarfile) Ⅱ die("$tarfile: $ ! \ Ⅱ " ) ; while ( ()s = read(TAR, $header, $header-size)) $print—header = $print—body = 1 ; if ($header eq $nullblock) { $header—size) { print $header if ($command eq 'pick' Ⅱ $command eq 'edit' ) ; 92 elsif ($command eq 'pick') { &show—header (@header) ; $print—header = $print—body = 0 ; if ($command eq 'list') { ($name = $header [$name-i] ) @header = unpack ($header—format , $header) ; $null—count = 0 ; last if ( + + $ u11 ー count UNIX MAGAZINE 1991.12
連載 / Li Language¯O # Sat Oct 5 10 : 46 : 00 PDT 1991 chop ($ctime) ; $ctime = &ctime($mtime) ; = &parse-header ( ー ) ; ($name , $mode , $uid , $gid , $size , $mtime , $chksum' sub show—header { ・ # show "tar tv" like information from header 16 ー ー 21 ) substr ($ctime , 16 , length ($ctime) substr($ctime, 0 , 4 ) $linkflag, $linkname) printf ( "%s%3d/%d%7d %s " unless $opt—t; print $name ; if ($linkflag eq ' 1 ' ) { " linked to pr int if ($linkflag eq ' 2 ' ) { print " symbolic link " [chksum=$chksum] " pr int # keep compatibility with tar if $opt—v; tO $linkname ; # symbolic link $linkname ; # hard link # terse &modeline($mode) , $uid, $gid, $size' $ctime) print " \n" ・ # make modeline like 'rw sub modeline { $mode{$g} $mode{$u} local($-) sub wildcard { ・ # vildcard tO regex convert $mode{$o}; ・ # eval with error handling sub eval { local($exp) eval $exp ; if ( $@ ne 10Ca1 ($package , $filename , $line) caller; warn "eval failed 0 取 line $line in file $filename\n" warn "exp = \"$exp\"\n" warn $@ ; exit 1 ; 94 UNIX MAGAZINE 1991.12
連載 / Li Language—O たはうがすっと簡単です。最初の部分で、 %mode と いう連想配列を定義しています。これを使って 1 を --x に、 7 を rwx にというように変換します。このはうが 簡単だということもありますが、 perl の t 算はあま り高速ではないので、実行速度の面でも有利です。 ・匠はニュースにもとんと疎く、 comp. lang. perl も はとんど読んでいません。しかし、いまのところ最新 ノヾージョンはまだ 4.010 のようですね。前に「 perl 入 門」を書いたときは 4.003 でしたが、それはどの変更は ないので今回は紹介しませんでした。ただ、バグが少な くなって、かなり安定して使えるようになっています。 おわりに リスト 1 # ! /usr/local/bin/perl ; # taro : tar organizer " a100 a8 a8 a8 a12 a12 a8 a a100 a*" ・ for (split ( / / , 'name mode uid gid size mtime chksum linkflag linkname pad' ) ) { ているように感じます。手に入る方は、ぜひ読んでみる したが、やはり作者が直接書いただけあって、数段優れ にも UNIX REVIEW に別の人か書いた記事がありま 所に感しられておもしろく読むことができました。以前 足かもしれませんが、 WalI 氏の信念のようなものか髄 すでに perl を使いこなしている人には内容的に少々不 に関する記事が掲載されていました。入門用ですから、 から 3 回にわたって、 Larry Wa Ⅱ氏自身による perl そういえば、 UNIX WORLD 誌の 1991 年 8 月号 処理を試してみてください。 のコマンドならすぐにできますから、せひ各種のデータ 向いているというよい例になったと思います。この程度 今回のテーマは、 perl がバイナリデータの処理にも とよいでしよう。 October 7 1991 srekcah@sra. CO ・」 p $usage Usage : くく taro taro taro taro taro taro list tar—file pick tar—file pattern [ pattern t て OW tar—file pattern [ pattern edit tar—file perl—script cat tar—file [ name s/foo/bar/ tar—file ; # SEE ALSO tar(l), tar(5) ” \ 0 " x $header—sxze; $nuIIbIock $header—format 512 ; $header—size require( ' ctime. pl' ) ; push(@INC, 'c: /etc/perl' ) ; # initialize header index 4 , 1ist # pick up some files throw away some files show fi1e contents edit f ilename short—cut for edit 6 , &eval(sprintf( '$%s-i # opt i 0 Ⅱ handl ing $opts ' dtv ) ・ $ARGV[O] , た一 / & & shift) { vhile ( $ ー next unless ($car, $cdr) = た一 ? ( . ) ( . * ) / ; if (index ($opts , &eval("\$opt-$car = length(\$cdr) ? \$cdr next ; UNIX MAGÄZINE 1991.12 \@ARGV ? shift &usage" ) ; 91
UN Ⅸへの招待⑩ % grep toplines ~ /. mallrc /usr/1ib/Ma-11 .rc /home/aya/. mailrc : set topl 土Ⅱ es = 10 % mail MaiI version SMI 4.0 1 五 u Oct 10 12 : 59 : 09 PDT 1990 Type ? f0 て help. "/usr/spool/mail/aya" : 2 messages 2 new 'lhu Oct 10 13 : 55 19 / 630 Enka1 no schedule >N 1 aya@home ・ co ・ JP 1 加 1 Oct 10 13 : 56 21 / 696 Thanks N 2 aya@home.co.jp & top 2 >From aya@home. CO. jp Oct 10 13 : 56 : 39 1991 Received: from okus 1. home ・ co ・ jp by danna. home ・ co ・ jp ( 5.65 + 1.6W / 2.8Wb—danna/1.1 ) with id AA02136 ; 1 Ⅱ , 11 Oct 91 13 : 56 : + 0900 Received: from home. CO ・ jp by 0kusan. home. co. 」 p ( 5.65 + 2. OWa ー NO ト旧 / 2.8Wb ー 0 lsa Ⅱ / 6.7 ) with S ト id AA22910 ; 皿 , 11 Oct 91 13 : 56 : 52 JST Received: by home. co ・ jp ( 5.65 + 2.0Wa ー NO 旧 / 2.8Wb—gateway/3.2 ) id AA29880 ; Thu, 11 Oct 91 13 : 56 : 50 JST Date: Thu, 11 Oct 91 13 : 56 : 50 JST From: aya@home.co ・ JP Return—Path: くaya@home.co ・ jp> 、ゝ headers コマンドが便利です。 メッセージを読んだか読まないか たくさんのメッセージが届いていると、それぞれのメッ セージをすでに読んだのか、あるいはまだ読んでいないの かが分からなくなる場合があります。このようなときは、 / mail コマンドの実行時に表示されるメッセージや、 headers から表示される情報には、 N ( 新しいメッセー ジ ) 、 U ( 古いメッセージ ) などの情報カ咐いています。 >U 1 畔a@Ⅱome ・ co ・〕 p U 2 aya@home.co ・ jp lhu Oct 10 13 : 55 盟Ⅲ Oct 10 13 : 56 N 3 Ⅱ1r0k001raⅡ . beer. co. jp 皿 iu Oct 10 16 : 01 19 / 630 21 / 696 59 / 1971 Enkai Ⅱ 0 schedule Thanks : paper メッセージを読んでしまうと、 headers の出力から N や、ゝのメッセージだけを読んだ場合、 headers の出力は次のよ U などの情報が消えます。たとえば、上の例で 1 と 3 番目 / , うになります。 1 aya@home. CO ・ JP U 2 aya@home.co ・ jp 盟 Oct 10 13 : 55 Oct 10 13 : 56 19 / 630 21 / 696 59 / 1971 Enkai Ⅱ 0 schedule Thanks Re : paper > 3 hiroko@uran.beer. co. jp 盟Ⅲ Oct 10 16 : 01 これを見れば、メッセージを読んだか読まないかが一目 で分かります。 headers コマンドに関連した mail のオプションに screen があります。このオプションには、 headers で出力 されるヘッダ情報を 1 回に何行ぶん表示するかを値として 代入します。たとえば、 20 行だけを表示したいときには、 set screen=20 と設定します。なお、 screen オプションが ~/. mailrc や /usr/lib/Mail. rc に記述されていれば、 mail コマンド起 動時のヘッダ情報も、その行数ぶんしか表示されません。 UNIX MAGAZINE 1991 ユ 2 このオプションを設定していない場合、 mail コマンドの 起動や headers コマンドの実行によるヘッダ情報が、現在 の画面に入るぶんだけ表示されます。しかし、オプション が設定されていると、その行数ぶんしか表示されません。 ヘッダ情報の残りの部分は、 mail のコマンド z を使って 参照します。 z は、 Z 十 と使うと、次の 1 画面 (screen で指定した行数ぶん ) のヘ ッダ情報を表示します。また、 z ーでは前の 1 画面ぶんのヘ ッダ情報を表示します。 159
UN Ⅸへの招待⑩ メールポックス内からはそのメッセージが削除されます。 mail のコマンド unread では、実際には読んだメッセ ただし、 mail のオプション hold を設定していると、読ん ージを読んでいないものとして印を付けることができます。 次の例を見てください。 だメッセージは / mbox には保存されすにメールポック スに残ったままとなります。 & headers 10 / 2 chotto ! Thu Oct 10 17 : 05 > 1 snoopy 11 / 256 machigal Thu Oct 10 17 : 10 N 2 belle & unread 1 & headers 10 / 2 otto ! Ⅱ Oct 10 17 05 >N 1 snoopy 11 / 256 machigai 新Ⅱ Oct 10 17 10 N 2 belle 削除したメッセージは、 /mbox に保存されす、メールポ 最初に実行した headers コマンドの結果から、 1 番目の ックスからも削除されます。しかし、 mail のオプション メッセージはすでに読んでいることが分かります。ここで hold や prese Ⅳ e ( どちらも同し機能 ) を設定していると、 unread を 1 番目のメッセージに対して実行したあと、再 削除したメッセージもメールポックスに残ります。 度 headers コマンドを実行すると、 1 番目のメッセージに は読んでいない旨の印が付いています。この状態で mail コマンドを終了すると、 unread の引数で指定したメッセ ・マークが付けられたメッセージ ージは読まなかったメッセージとして処理されます。 mail のコマンド hold や preserve では、メッセージに quit コマンドで mail コマンドを終了すると、読んだメ 印が付けられます。 quit コマンドで mail コマンドを終了 ッセージは通常 /mbox の最後に追加書込みされます。し したとき、マークが付いているメッセージは、メールポッ かし、 mail のオプション noappend を設定していると、 クス内にそのまま残されます。 メッセージは / mbox の先頭に書き込まれます。 前述したように、 quit コマンドで終了すると、いったん 読んだメッセージは (unread で読まなかったことにする か、 h 。 ld オプションを設定している場合を除き ) メールポ ・読まなかったメッセージ 実際に読まなかったメッセージや unread の対象にし ックスからは消されてしまいます。たとえは、あるメッセ ージに対して返事を出したいが ( 返事の出し方は次号で説 たメッセージは、メールポックス内に残されたままになり ます。したがって、次に mail コマンドを起動したとき、そ 明します ) 、ゆっくり返事を書いている時間はない、そのよ のメッセージを扱うこともできます。 うな場合は、 hold メッセージ番号 ・保存したメッセージ メッセージは、自分が指定したファイルに保存すること でマークを付けておくか unread で処理しておけは、 mail も可能です。方法は後述しますが、 quit で mail コマンド コマンドを終了してもメッセージはメールポックスに残っ たままですから、あとで mail を実行してゆっくり返事を を終了するとき、保存したメッセージはメールポックス内 書くことができます。 から削除されます。しかし、 mail のオプション keepsave を設定していると、保存したメッセージは / mbox にも書 exit 、 xit での終了 き込まれます。また、 mail のオプション hold を設定して いると、保存したメッセージもメールポックスに残ります。 quit では、メッセージに対するさまざまな処理がおこな われます。一方、 exit や xit はいたって単純です。これら のコマンドでは、メールポックスの内容はまったく変更さ ・削除したメッセージ 不要なメッセージは削除できます ( 方法は後述します ) 。 れません。したがって、メッセージに対してどのような処 164 UNIX MAGAZINE 1991.12
UN Ⅸへの招待⑩ % m 凾 1 MaiI version SMI 4.0 ・ l'hu Oct 10 12 : 59 : 09 PDT 1990 Type ? for elp. "/usr/spool/mail/aya" : 2 messages 2 new 新 11 Oct 10 13 : 55 19 / 630 Enkai Ⅱ 0 schedule >N 1 aya@home ・ co ・ JP 盟 1 Ⅱ Oct 10 13 : 56 21 / 696 Thanks N 2 snoopy@home.co. JP この例では、 N の次に表示されている 1 、 2 がメッセー ゝので、各種の操作をして画面がスクロールすると見えなく ジ番号です。 なってしまいます。そのような場合は、 headers という このメッセージは mail コマンドの起動時に表示される / mail のコマンドでも調べられます。 & headers N 1 aya@home.co ・ JP 19 / 630 a 土Ⅱ 0 schedule 新 11 Oct 10 13 : 55 21 / 696 新 s > 2 snoopy@home.co ・ JP Thu Oct 10 13 : 56 ゝカレント・メッセージのメッセージ番号は、 = という mail のコマンドで調べられます。 カレント・メッセージ mail コマンドの起動時や headers で表示されるヘッダ 情報の行頭に〉が付いているものがあります。これを、カ レント・メッセージと呼びます。 mail コマンドを起動したときのカレント・メッセージ は、メッセージ番号 1 のメッセージです。また、あるメッ この例では、カレント・メッセージのメッセージ番号は セージを mail のコマンドで処理すると、その時点からそ 2 となっています。また、カレント・メッセージに関する れがカレント・メッセージになります ( ただし、メッセージ ヘッダ情報を表示する from という mail のコマンドもあ を削除した場合はその次のメッセージになります ) 。 ります。 & from > 2 aya@home ・ co ・ JP あれこれ操作しているうちにどのメッセージがカレン の対象となります。たとえは、 ト・メッセージか分からなくなったら、 = コマンドか from & p 1 2 3 コマンドを使えばよいわけです。 では、メッセージ番号 1 、 2 、 3 のメッセージが、 メッセージ番号の指定方法 & p 1 ー 5 大部分の mail のコマンドでは、引数で次のどちらかの 形式のメッセージ番号が指定できます。 では、メッセージ番号 1 ~ 5 のすべてのメッセージが表示 されます ( 後述しますが、 p はメッセージを表示する mail 1 ) ma ⅱのコマンド msg. のコマンドです ) 。 2 ) ma ⅱのコマンド msgM-msgN 特殊な文字を使ったメッセージの指定 最初の形式では、 sg で指定したメッセージが mail の コマンドの対象となります。 2 番目の形式では、 msgM か メッセージの指定では、メッセージ番号のはかに次の文 字が使用できます。 ら msgN までのすべてのメッセージが mail のコマンド & 2 & 21 / 696 皿 Oct 10 13 : 56 manks 157 UNIX MAGAZINE 1991.12
なります。したがって、 mail コマンドの実行中に新しいメ ッセージが届いても、それは現在の mail コマンドのなか では読めません。 SunOS では、 mail コマンド実行中に届いたメッセージ を取り込むコマンド inc が提供されています。たとえは / UN Ⅸへの招待⑩ 、 Q)iff や xbiff などを使っていて、 mail の実行時に新しいメ ッセージが届いたことを知ったとしましよう。このような ときは、 inc コマンドを使って現在の mail コマンドに新 & headers N 1 aya@home.co ・ JP > 2 aya@home.co ・ JP 盟 iu Oct 10 13 : 55 良 1 Oct 10 13 : 56 N 3 MAILER—DAEMON@home. co. jp 1 れ u Oct 10 N 4 hiroko@uran.beer. co. JP Oct 10 N 5 aya 盟 lu Oct 10 16 : 40 & inc "/usr/spool/mall/aya" : 6 messages 1 new 16 : 01 14 : 08 & headers N 1 aya@home.co ・ JP 2 aya@home.co. JP 盟 u.l Oct 10 13 : 55 1 五 u Oct 10 13 : 56 N 3 MAILER-DAAfON@home. co. jp 盟 lu Oct 10 N 4 hiroko@uran.beer. co ・ JP 盟 1 Ⅱ Oct 10 14 : 08 16 : 01 N 5 aya >N 6 aya@home.co ・ JP 1 五 u Oct 10 16 : 40 新 11 Oct 10 16 : 41 この例からも分かるように、新たに取り込まれたメッセ ージは最初に読み込まれたメッセージの後ろに追加されま す。また、カレント・メッセージは新しく追加した最初の メッセージに移ります。 UNIX コマンドによるメッセージの処理 SunOS の ma ⅱコマンドでは、メッセージを UNIX コ マンドの標準入力として渡すことができます。これは、 & ーメッセージ番号 UN Ⅸコマンド という形式で使います。たとえは、 2 番目のメッセージを プリンタに出力したいときは、 しいメッセージが取り込めます。 hlkai Ⅱ 0 schedule Thanks Returned mai1 : Cannot sen Re: paper Seminar program Enkai Ⅱ 0 schedule ranks Returned maxl : Cannot sen Re: paper Seminar c 訌 1 for paper 19 / 627 16 / 356 59 / 1971 28 / 1295 21 / 696 19 / 630 16 / 356 59 / 1971 28 / 1295 21 / 696 19 / 630 などの操作はできないのです。 & ー 2 mail snoopy どは使えません。つまり、 うなコマンド、あるいは出力リダイレクション、バイプな ド名しか指定できません。したがって、引数をともなうよ この機能では、、、 UNIX コマンド〃の部分で単一のコマン のようにします。 Pipe tO : " lp て " & ー 2 lpr mail コマンドの終了とメッセージ mail コマンドを終了するときは、 mail のコマンド quit 、 exit 、 xit などを使用します。 quit は q 、 xit は x と 省略して入力できます ( exit は省略できません ) 。なお、こ UNIX MAGAZINE 1991.12 quit コマンドで mail を終了すると、 mail コマンドは quit での終了 はできません。 れらのコマンドの引数に特定のメッセージを指定すること メールポックス内のメッセージに対してなんらかの処理を おこないます。この処理は、 mail のオプション設定や、メ ッセージをどのように処理したかによって異なります。そ れぞれのケースを紹介していきましよう。 ・すでに読んだメッセージ すでに読んだメッセージについては、ホームディレクト リの mbox というファイルにその内容が追加書込みされ、 163
連載 / / Li Language¯ ・ファイル名のリスト taro の実装 うな情報か書かれていることが分かります。 これを見ると tar のヘッダは 512 バイトで、次のよ 手段もあるでしよう。 も、 GNUTar などフリーのソースを参考にするという で、これを見ればなんとかなりそうです。これ以外に tar(5) というマニュアルに tar 形式の説明があるの 2 にも含まれていません ) 。しかし、さいわいなことに 7 月にリリースされた Berkeley Network Software の tar はフリーソフトウェアではありません ( 今年の にはソースを見るのが一番ですが、残念ながら、 BSD ているファイル形式を理解しなければなりません。それ さて taro を作るためには、何はともあれ tar の使っ taro extract 尾ん加 e [ file . 変更日時を設定したりはしません。 イルを作るだけで、中間のディレクトリを作ったり、 勢いで付けてしまいました。ただし、たんにそのファ いことが分かって、ファイルを取り出すオプションも 自宅で原稿を書いていたら MS-DOS には tar がな ・ファイルの取出し taro list 0 尾ん加 e タックスは次のとおりです。 中にデバッグするために自然にできた機能です。シン 機能も付けましよう。これはどちらかというと、開発 ついでに、アーカイプのなかのファイルをリストする フィーノレド ファイル名 モード uid gid サイズ 最終変更日時 チェックサム リンクフラグ リンク名 100 8 8 8 12 12 8 1 100 NULL で終る 8 進 ASCII 表現 8 進 ASCII 表現 8 進 ASCII 表現 8 進 ASCII 表現 8 進 ASCII 表現 8 進 ASCII 表現 ードリンク 2 : シンポリック・リンク NULL で終る 残りの部分には NULL が詰められます。なぜか、数 値データは 8 進数を ASCII で表現した形式になってい 90 ます。また、 uid や gid などの最後の 2 バイトは空白 と NULL です。このヘッダ情報を読み込むためのテン プレートは次のようになります。 " a100 a8 a8 a8 a12 a12 a8 a a100 a*" これを使って unpack すればいいわけです。ヘッダ の後ろには、実際のファイルの内容か書かれます。ただ し、 512 バイトのプロック単位で書かれているので、最 後の半端は無視しなければなりません。コマンドを作っ ていて気つ、いたのですが、この半端の部分には NULL が詰まっているわけではなく、前に使った残りのでた らめなデータが入っています。また、ハードリンクの場 合には、サイズは入っていても中身がないのですぐ次の ヘッダカきます。 うつかりサイズぶんだけ読んでしまうと、次のファイ ルのヘッダを読むことになるので注意が必要です。 ほかにも tar 形式にはさまざまなきまりがあるよう ですが、あまり細かいことは気にしないことにします。 ただし、ファイルの最後には全部が NULL の 512 バイ トのプロック (null block ) が 2 つないと、 tar でうま く読めません。 ちょっと面倒なのはファイル名を変更したときで、 この場合はヘッダのチェックサムが変わるので、計算 しなおす必要があります。これをおこなっているのが makeheader のサプルーチンで、ますチェックサムの部 分を全部空白にしてヘッダを作り、 unpack("%16C*" $header) という部分でチェックサムを計算します。そ の後、再度へッダを作ります。このチェックサムが合っ ていないと、 tar カゞ directory checksum error とい って処理してくれません。 ファイル名のリストを表示するときには、日時を ASCII 形式で表現しなければならないのですが、これ には ctime. pl を拝借しました。 &ctime の結果を、 tar tv の出力と同しになるよう にあとから編集します。その後 linkflag を見て、ハー ドリンクやシンポリック・リンクの情報を表示します。 リストの最初の部分には、ファイルのモードを、、 rwxr- 乂 r ー x " のような形式で表示します。ファイルのなかのデ ータは、、 755 " というかたちで入っていますから、変換 する必要があります。ふつうに考えるとピット操作によ る変換を思いっきますが、 perl の場合は連想配列を使っ UNIX MAGAZINE 1991.12
MBOX に設定したフォルダーが存在しない場合はその S(ave) msg のコマンドも提供されています。このコマンドは、 SunOS では、メッセージを保存する Save という Save コマンドでの保存 書込みされます。 フォルダーが作成され、存在すればそのフォルダーに追加 mail 両方が保存されます ( オプション alwaysignore の影響も コマンドと同様、メッセージへッダとメッセージボディの ト・メッセージが保存されます。このコマンドでは、 save と使います ( 括弧内は省略可能 ) 。襯 sg を省略すると、カレン " + hiroko" [New file] 38 / 680 & S 2 N 2 Ⅱ1r0k0@ur田1.beer.co.jp Thu Oct 10 20. >N 1 aya & headers 同しです ) 。 ・ 26 UNIX MAGAZINE 1991 ユ 2 ば、それに追加されます ) 。 されます ( カレント・ディレクトリに同名のファイルがあれ このとき、フォルダーはカレント・ディレクトリに作成 UN Ⅸへの招待⑩ Oct 10 20 : 23 N 2 hiroko@uran.beer.co.jp 1 五 u Oct 10 20 : 26 35 / 1397 Re : proceedings >N 1 aya 盟 Oct 10 20 : 23 11 / 284 test "/usr/spool/mail/aya" : 2 messages 2 new MaiI version SMI 4.0 mu Oct 10 12 : 59 : 09 PDT 1990 Type ? for elp. Sun—% mail >N 1 aya 盟 Oct 10 20 : 23 11 / 284 test "/usr/spool/mail/aya" : 2 messages 2 new M 1 version SMI 4.0 盟 Oct 10 12 : 59 : 09 PDT 1990 Type ? for elp. Sun—% mail Sun—% setenv OX -/Mai1/keep 数を設定した場合、 msg と万ル襯召の両方を省略すると一 , ダー ( ファイル名 ) を設定することもできます。この環境変保存されます。 このほか、シェルの環境変数 MB 〇 X で保存するフォル、ゝ MB 〇 X で設定したフォルダーにカレント・メッセージが "/home/snoopy/aya/mbox" [Appended] 11 / 2 "/home/snoopy/aya/Ma11/keep" CNew file] 35 / 1407 N 2 五土r0k0傾1ran. beer. co. 」 p 盟 Oct 10 20 : 26 35 / 1397 Re : proceedings save と Save コマンドでは、メッセージが保存されるフ ォルダーが異なります。 Save コマンドでは引数に万ん - 〃襯 e は指定できず、指定したメッセージがメッセージの 発信者 ( Fr 。 m ) の名前のフォルダーに保存されます。発信 者のアドレスは、 ログイン名@ ドメイン名 . . ドメイン名 となっていますが、フォルダーの名前には、、ログイン名〃 だけが使われます ()以降は使用されません ) 。たとえは、 snoopy@home.co ・ JP というユーサーから届いたメッセージは、十 snoopy とい う名前のフォルダーに保存されます ( フォルダー名の先頭 にはヾ十〃が付きます ) 。では、例を見てみましよう。 11 / 284 test 38 / 1484 Re : proceedxngs ところで、 Save コマンドに関連した mail のオプション に folder があります。このオプションには、フォルダーを 置くディレクトリのパス名を、 167