寺集 % alias dir ls ()m -i) 3 モーレッ UNIX [ 1 ] 2763 ように コマンドをバックグラウンドで実行すると、上記の例の ls' という工イリアス設疋は取り消したので、最初にお こなった rm と、 dir ・という工イリアス成疋か表小さ れます。ェイリアスのループに陥る状況ははかにもありま すが、詳しくは末尾の参考文献などを読んでください。 ジョブ制御 UNIX MAGAZINE 1996.8 を使うと、複数のコマンドの組合せが 1 つのジョブとなります。 16 仕事の単位で、通常は 1 つのコマンドカにれ ( 目当します。パイプなど に回されたジョブは、端末の裏側でがんばってくれます。 プをバックグラウンド・ジョブといい、バックグラウンド のコマンドを受け付けてくれます。、、 & " 旨定されたジョ すると、シェルはコマンドの終了を待たすに、すぐに次 [ 1 ] 2763 % xclock & ら起重丿ける際、かならす末尾に & を付けていました。 これまでに何回か出てきましたが、 X のツールを端末か 思い浮かべてもらえればいいでしよう。 ジとしては、、、ジョブか端末ーヒでがんはっている " 本子を ジョブをフォアグラウンド・ジョブと呼びます。イメー 終了するまで次のコマンドを実行できません。このような 通常、シェルでコマンドを実行すると、そのコマンドが 表のジョフと裏のジョブ 類を理解しておく必要があります。 プ制御といいますが、使い方を説明する前に、ジョブの種 えながら、並行して竹業をおこなえます。この機能をジョ C シェルでは、 1 つのシェルで複数のジョブを切り替 に端末工ミュレータを起けるのも面倒です。 ができます。しかし、複数のコマンドを実行するためだけ の端末工ミュレータで別のジョフ 16 を同時におこなうこと これに対し、 X などのマルチウインドウ環竟だと、複数 終了をじっと待っているのはもったいない気がします。 しかし、 UNIX はマルチタスクの OS です。コマンドの 行か終了するまで次のコマンドを受け付けてくれません。 C シェルでコマンドを実行すると、通常はコマンドの実 という行か端末に表示されます。最初の番号 ( [ 1 ] ) はジョ プ番号、 2 番目の番号はプロセス ID と呼ばれます。プロ セス ID は次回以降に譲るとして、 こで重要なのはジョ プ番号です。フォアグラウンド・ジョブはコマンド行で隧 朝勺に処理するため、 1 つのシェルにつき 1 個しか実行で きませんが、バックグラウンド・ジョブは 1 つのシェル から何個でも実行できます。バックグラウンド・ジョブに 割り当てられたジョブ番号は、あとで紹介する扣 bs コマ ンドで市忍できます。 ジョブえと尺 C シェルには、コマンドの実イにフォアグラウンド / バックグラウンドを選べるだけでなく、フォアグラウンド で実行中のコマンドをバックグラウンドに回したり、逆の 操作もできます。 フォアグラウンドて処理しているコマンドをバックグラ ウンドに回すには、ますコマンドの処理を一ヨ判勺に停止し ます。たとえは、 xclock を実行する際、 & を付けるのを忘 れてしまったとしましよう。すると、 xclock のウインド ウは画面に現れるものの、フォアグラウンドて処理されて しまうため、 xclock を強制終了しなけれは次に進めませ ん。このような場合、コマンド行で、、 C ー z " を入力します。 % xterm & [ 1 ] 2791 % xclock Suspended こで C ー z を入力 「一日亭止したで」というメッセージか表ノバさシェル がコマンドを受け付けるようになりました。 C シェルの組 込みコマンドである扣 bs を使うと、ジョブの状態を表示 することができます。 % j obs [ 1 ] ー Running [ 2 ] + Suspended xterm xclock xclock の則に xterm をノヾックグラウンドで実行してい たので、 xclock には、、 2 " というジョブ番号か割り当てら 35
3 モーレッ UNIX 寺集 ともできます。 * や ? 、 [ ] を使った場合、パターンにマッチするファイ ルがなければコマンドは実行されません。 { } の場合、マッ チするファイルがなくても、置き換えたファイルを引数と してコマンドが実行されます。ただし、 { } の中身に * や ? などが含まれていると、マッチしない場合はコマンドカ躾 行されません。 あつぶる : * や ? はともかく、カッコて括るってややこし いなあ。カッコの中身を考えてる暇があったら、最初 から全部入力したほうが早いんじゃないですか ? monkey : ある程度慣れてきたら、頭で考える前に指先 が反応するもんや。実際に使ってみな分からへんやろ うから、積極的にバンバン試してみ。 たしかに、実際にさまざまな場面で使ってみないと、メ タキャラクタのありがたみは分かりません。しかし、慣れ ないうちは、指定の仕方を間違えて痛い目に遭うこともあ ります。 rm はファイルを消すコマンドですが 11 、引数と して指定するファイル名にメタキャラクタを使う場合は、 すこしだけ慎重になりましよう。 たとえは、あつぶるちゃんがレポートだけを消そうと して、、、 rm r *. txt " と入力するところを間違えて、、 rm *. txt " としてしまうと、末尾に . txt の付いたファイルが すべて消えてしまいます。とくに設定しないかぎり、 rm コマンドは何もいわすに指定したファイルを消してしまう ので、気ついたときは後の祭りです。ある程度使い慣れた 人でも、寝不足でば一つとしていたり、あせっていたりす るとこのような間違いか起こりがちです 12 入出力のえ UNIX では、コマンドに対する入力やコマンドからの 出力に対して 3 種類の装置 13 が用意されています。それ ぞれ、標準入力、標準出力、標準工ラー出力と呼ば以 下のような彳難リをもちます。 11 ファイノ巣作に関するコマンドについては災可で詳しく紹介する予定 てす。 12 rm を実行する前に、同し引数で echo コマンドを実行してどのような ファイルが rm の対象となるかを石忍する人もいます。つまり、 echo r*. txt て市忍してから rm r*. txt を実行するのです。 13 入出力をおこなう、箱 " があるわけではなく、ソフ - トウェアで寒見され UNIX MAGAZINE 1996.8 たイ反想的な装置です。 ・標準入力 コマンドが、ユーサーなどからなんらかの入力を求める 場合に用います。 ・標準出力 コマンドか実行結果を出力するために用います。 ・標準ェラー出力 コマンドがエラーメッセージを出力する場合に用いま す。 とくに変更しないかぎり、これらの装置は端末と関係づ けられています。つまり、コマンド実行中になんらかの 入力を求められると、ユーサーは端末を通じて入力します し、コマンドの実行結果やエラーメッセージなどは端末に 表示されます。 シェルは、これらの入出力先を端末からファイルに切り 替える機能をもっており、これをリダイレクション ( redi ー recti 。 n ) 14 と呼びます。リダイレクションをおこなうに 、 > & " などのメタキャラクタを用い、右 はく 側に切替え先となるファイルなどを指定します。 標準入力、標準出力、標準工ラー出力のそれぞれについ て、リダイレクションのガ去を紹介します。 標準入力のリダイレクション 標準入力を端末からファイルに切り替えるには、くを 用います。右側にファイルを指定すると、端末の代わりに ファイルからデータか読み込まれます。 たとえは、 mail コマンドを使って電子メールを送る場 合、通常メールの本文はユーザーか端末から入力しなけれ はなりません。 % mail monkey apple desu. kyou Ⅱ 0 yotei WO osiete kuremasenka? EOT mail コマンドの詳しい使い方については次回以降で紹 介しますが、宛先を引数として実行し、メールの本文をユ ーザーが端末を通して入力します ( 下線部 ) 。最後の だけの行は、本文の終りを示すための記号です。 14 入出力先を端未からファイルなどに、向けなおす " ことを意味します。 31
特集 表 1 おもなシェル変数 3 モーレッ IJNIX 説明 C シェルでされたスクリプトを実行する際の引数リスト 現在自分のいるディレクトリ cd コマンドてサプディレクトリを移動庁る際の、起点となるディレクトリのリスト ファイル名の補完機能のオン / オフ ヒストリーリストを保存するファイル名を指定 ヒストリーリストの長さを指定 ューサーのホームディレクトリ c - dl によるシェルの終了を禁止 既存のファイルに対する、出力リダイレクションを禁止 コマンドのサーチパス コマンド・プロンプトに使う文字列 ファイルに保存するヒストリーリストの長さを指定 ログイン時に起動するシェル コマンド ( プロセス ) の終了ステータス 2 端末の不頁 ューサー名 1. C - ェは、、コントロールキーを押しながら工というキーを押す " ことを未します。 2. 多くの場合、コマンドカ症常終了すると 0 、エラーなどで異常終了すると 1 になります。 名前 argv cwd cdpath filec histfile history home ignoreeof noclobber path prompt savehist shell status term 型 多イ 単イ豐 多イ豐 論理型 単朝豐 単イ豐 単イ町豐 論理型 論理型 多イ豐 単イ豐 単豐 単イ豐 単イ豐 単イ町豐 単イ町 ザーごとに構築できるため、このような名前カ咐けられて います。 C シェルでは、環境変数を操作する組込みコマンドと して、 setenv と unsetenv コマンドが用意されていま す。これて羅竟変数の設定、取消しをおこないます。竟 変数 PRINTER を例に、これらのコマンドの使い方を紹介 します。 PRINTER の値をセットするには、次のように実行しま す。 % setenv PRINTER psprinter シェル変数を設定する set コマンドと違い、変数名と値 はスペースて区切ります。値を省略すると、値カ啌の変数 が定義されます。 unsetenv は setenv の逆で、変数自体を取り消します。 unset コマンドと同しく、変数名だけを指定します。 % unsetenv PRINTER 設疋した環境変数の値を表刀ヾするには、 printenv 、あ るいは e Ⅱ v コマンドを使います 9 。いすれも、引数なしで 9 これらは、組込みコマンドではありません。多くの場合、 /usr/ucb あ るいは /usr/bin に置かれています。 28 実行すると、現在設定されている竟変数の名前とその値 がすべて表示されます。 printenv では、引数として工竟 変数の名前を与えると、その値だけを表示します。 PRI NTER=p spr i nt e r TERM=kterm HOME=/home/app1e SHELL=/bin/csh LOGNAME=app1 e USER=app1e PATH=/usr/bin : /bin PWD=/home/app1e % printenv PRINTER psprinter コマンド行て環竟変数名の地寬こ $ を付けると、シェ ルか変数の値で置き換えてくれます。したがって、シェル 変数の場合と同様に、 echo コマンドを使って特定の竟 変数の値を調べることもできます。 % echo $PRINTER psprinter 環境変数は基本的にシェル変数と無関係ですが、なか にはシェル変数と連動しているものがあります。具ー勺に は、表 2 の組合迂です。 UNIX MAGAZINE 1996.8
UN Ⅸへの招待⑩ 表 1 Bourne シェルと Korn シェルの変数 変数 CDPATH COLUMNS EDITOR ENV ERRN 0 FCEDIT FPATH HISTFILE HISTSIZE HOME IFS LINENO MAIL MAILCHECK MAILPATH OLDPWD OPTARG OPTIND PATH PPID PSI PS2 PS3 PS4 PWD RANDOM REPLY SECONDS SHELL TMOUT VISUAL B シェ ) レ K シェル 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 〇 cd コマンドのディレクトリ検索パス 編集機能を使用するときの画面幅 編集機能を使用するときのエデイタ名 (emacs 、 gmacs 、 シェル起重加寺 = に夫行するシェル・スクリプト名 最後に失敗したシステムコールか殳定した errono の値 fc コマンドが使用するエデイタ名 オートロード関数の検索パス ヒストリー・ファイル ( 省田都芋は . sh-history) 編集機能を使用する際のエデイタ名 (emacs 、 gmacs 、ⅵ ) いと自重加勺にログアウトする ) タイムアウト ( 1 次プロンプトを出したあと、指定秒数以内にコマンドの入力がな シェノレのノヾス名 シェルを起動してからの経過秒数 select または read コマンドの省日翻学の朝 ( り変数 乱数の発生 カレントディレクトリのパス名 コマンドの実行をトレースするとき、各行の知頁に付ける文字 select によるルーフ。内でのプロンプト 2 次プロンプト ( > ) 1 次プロンプト ( $ ) シェルの栽 . のフ。ロセス番号 コマンドの検索パス getopts コマンドて処理された最後のオプションのインデックス getopts コマンドて処理された最後のオプションの値 cd コマンドの実行時に言殳定される直前の竹業ディレクトリ メールポックスの位置のリスト メールポックスを検査する間隔 ( 単位は秒。省田は 600 = 10 分 ) メールポックスの位置 ( メールの到着が通知される ) 現在行の番号 シェルのフィールド・セパレータ ( 通常は、スペース、タブ、改行 ) cd コマンドで引数を省略した際の移動先ディレクトリ ( ホームディレクトリ ) ヒストリー機能で記されているコマンド数 ( 省田翻は 128 ) ホームディレクトリが共通になっている場合を考えてみ ましよう。このとき、マシン A からログインした際のロ グインシェルは Bourne シェル、マシン B からログイ ンした際は Korn シェルだとすると、 1 つの . profile が Bourne シェルと Korn シェルの両方から参照されます。 このような場合には、次の理由から . profile の書き方に注 意が必要です。 ・エイリアスは Korn シェル特有の機能である。 関数の定義方去が、 Korn シェルと Bourne シェルで 異なる。 こオび丿、外にも、 Korn シェルと Bourne シェルとでは 大部分のシェル変数が異なります俵 1 ) 。サポートされ UNIX MAGAZINE 1996.8 ていない変数を定義してもエラーにはなりませんが、いち おう考慮に入れておいたほうがいいかもしれません。 以降では、これらの点をふまえた . pr 。 file の書き方をみ ていきましよう。 コマント・検索パスー PAT Ⅱの 1996 年 2 月号でも触れましたが、ユーザーがコマン ドを入力すると、シェルは変数 PATH に言聢された値の 順にそのコマンドの実行可能ファイルを探し、検出した 点で実行します。ーヨ殳に、変数 PATH には、、 " ( カレ ントディレクトリ ) や /usr/bin カイ直として代入されてい ます。しかし、たいていのシステムでは、これ J)J 、タ ) ディ 147
3 特集モーレッ UNIX シェルの糸みコマンド るとある機能力硬えるようになったり、値を変えると か変わるようになります。 多くのシェルは、 ls や xterm などのように独立したプ C シェルが内部で保持している変数をシェル変数とい ログラムをコマンドとして実行するだけでなく、あらかじ い、組込みコマンドである set や unset を使って操作し めシェルのプログラムに組み込まれているコマンドをいく ます。シェル変数の名前には、あとで紹介する竟変数と つかもっています。このようなコマンドは糸腿みコマンド 区別するため、たいていは path や home のようにアル (built-in command) と呼はれ、 C シェルなら echo 、 ファベットの小文字かイ吏われます。 set 、 unset 、 alias 、 history など、さまざまなものが 変数は値のとり方によって 3 つに分かれ、ここでは便 用意されています。 喃的に論理型、単値型、多値型と呼ぶことにします。 ls や xterm などのコマンドがカーネルに実行要求を出 論理型のシェル変数の場合、変数をセットすることて特 すのに対し、組込みコマンドはシェルのプログラム内部で 定の機能力硬えます。たとえば、ファイル名の補完機能の 処理されます。組込みコマンドについては必要に応して紹 オン / オフをおこなうシェル変数は filec で、補元機能 こでは系Ⅲムみコマンドかそうでな 介していきますので、 を使いたい場合は以下のように実行します。 いかの見分け方だけ説明しておきます。 set filec C シェルの組込みコマンドの 1 つに、 which がありま す。これはコマンドのありかを探すプログラムで、引数に 単値型のシェル変数は、値を 1 つだけとります。値は コマンド名を指定すると、 ( あとで説明する ) コマンドの 新直の場合もあれは、文字列の場合もあります。 C シェル サーチパスに従ってファイルツリーを検索します。 ls コ では、コマンドを受け付ける状態になると、、 % " を表示し、 マンドを探してみましよう。 ューサーはその後ろにコマンドを入力します。、、 % " はコマ ンド・プロンプトと呼はれ、 prompt 変数によって変更 % which ls /bin/ls することができます。 % set prompt='mohretsu mohretsu 目 実行結果を見ると、 ls コマンドが / bin ディレクトリに 置かれていることが分かります。指定したコマンドがみつ 値がスペースを含んだ文字列の場合は、一ト記のように値 からない場合はエラーとなり、「みつからへんで」という を , ( 単一引用符 ) で囲みます。 未のメッセージか表示されます。 多値型のシェル変数は、複数の値をスペースで区切り、 では、組込みコマンドはどうなるでしようか ? 値のリスト本をカッコで囲みます。たとえば、シェルは % which which ls などのコマンドを探すとき、サーチパスを利用します。 which : she11 built—in command . サーチパスは複数のディレクトリ名を含み、これらのディ レクトリを対象に検索をおこないます。サーチパス尉寺 ちゃんと「 which は組込みコマンドやで」というメッ するシェル変数は path で、以下のように設疋します。 セージが表示されます (BSD/OS の場合 ) 。ちなみに、後 % set path=\ 述する bash などは help という組込みコマンドをもち、 (/usr/local/bin /usr/X11/bin \ 引数なしで実行すると、自分のもつムみコマンドの一覧 /usr/ucb /usr/bin /bin) を表示してくれます。残念ながら C シェルにはこのよう な機能はないので、一覧を見たい場合は csh のオンライ この場合は、サーチパスとして 5 つのディレクトリを ン・マニュアルや、参考文献などを読むしかありません。 指定したことになります。ューサーがコマンドを実行しよ シェル変数 うとすると、シェルはサーチパスで指定されたディレクト リを探し、みつかるとそれを実行します 8 C シェルは、シェル自身の重川を定義する変数をもっ ています。前回の twrn の設疋と同じで、変数をセットす 8 みつからなかった場合、「コマンドかないで」といって怒られます。 26 UNIX MAGAZINE 1996.8
3 特集モーレッ UNIX 去のコマンド入力をある程度シェルが應えてくれるので、 同じコマンドを何回もタイプしなくとも、簡単に繰り返す ことかできます。 とくに設定しない場合、 C シェルは直前のコマンド だけを憶えています。これを繰り返すには、コマンド行 で、、 ! ! " を入力します。 録で、この例の場合、次にコマンドを入力すると、、 38 " と いうヒストリー番号か割り当てられ、 8 番のヒストリーが リストから削除されます。 ヒストリー番号を使って過去のコマンド入力を呼び出す 、、 ! れ " 朝はヒストリー番号 ) で指定します。 % ls mai11. txt mailll . txt mai112 . txt mai11 . txt mailll . txt mai112. txt % ! 33 j0bs [ 1 ] + Running mai12. txt reportl . txt report2. txt mai12. txt reportl . txt report2. txt report3 report3 . txt . txt xclock C シェルは、、ヒストリーリスト " と呼ばれるリストをも ち、そこに過去のコマンド入力を言当求します。とくに設定 しなければリストの長さは、、 1 " なので、直前のコマンド入 力しか言当求されていません。 ヒストリーリストの長さを変更するには、 history と いうシェル変数を用います。たとえば、ヒストリーリスト に過去 30 行ぶんのコマンド入力を言当求させたい場合は、 set history=30 のように実行します。すると、それ以降のコマンド入力が どんどんヒストリーリストに記録され、 30 を超えると一 番占い言当鱠てられます。 C シェルの組込みコマンドである history を使うと、ヒ ストリーリストを表示できます。ある程隻のコマンドを入 力してから、 hist 。 ry コマンドを実行してみましよう。 % history 十 . 記の例では、ヒストリーリストの 33 番に言求された コマンド入力 ( この例では、、 jobs") か表示され、、、 ! 33 " が、 j 。 bs " に置き換えられてから実行されます。 、、 ! ードのように指定すると、を番目に新しいヒストリー ストの内容を実行します。上記の例の ! 33 の代わりに ! ー 5 と入力しても、同じ結果か得られます。 ヒストリーリストからの呼出しは、ヒストリー番号だけ でなく文字列でおこなうこともできます。文字列でヒスト リーを呼び出すには、 xedit f00. txt [ 2 ] 3678 、 ! s 作 " のように指定します。 8 9 10 12 33 34 35 36 37 ls xclock & ls fg j obs cd /tmp xedit f00. txt ls history 各行の頁にある番号は、入力したコマンドに対するヒ ストリー番号です。ヒストリー番号カ吠きいほど新しい記 UNIX MAGAZINE 1996.8 、、 x " という文字例 ) を指定すると、 シェルはヒストリーリストを検索し、、、 x " て始まるエント この例のように、 用するには savehist というシェル変数をセットします。 次にログインしたときに、前のヒストリーリストを再利 まいます。 すると、ヒストリーリストもきれいさつばりなくなってし 果があります。しかし、ユーサーがマシンからログアウト 簡単に再実行できるので、コマンド入力カ張いものほど効 ヒストリーリストを使うと、過去に実行したコマンドを 出すには、 !xc" と指定します。 がさきにマッチします。この去で、、 xclock & " を呼び のに向かっておこなわれるので、 xedit f00. txt & edit f00. txt & " ですが、検索は新しいものから古いも リを探します。これに該当するのは、、 xclock & " と、、 x ー set savehist=20 history 変数と同様に直を与え、たとえば、 37
UN Ⅸへの招待⑩ FPATH : 同一匕 TERM : 端末の型に依存して動くコマンドに必喫。 このはかにも、それぞれの竟に必要なものは export してください。 工イリアスや関数の定義 には、たとえは次のように関数やェイリアスの定義を書き という 1 行を言しておきます。次に、 ${HOME}/. ksh ENV=${HOME}/. ksh ; export ENV くとします。このとき、 . profile には、 を、ホームディレクトリの下の . ksh というファイルに書 具イ列を見てみましよう。 Korn シェルに対する設定 が使えるようになります。 ログラムでもログインシェルと同様の関数やェイリアス 代入し、そ窈旨定を . pr 。鼠 e に書いておけば、シェル・プ リアスの設定などを言己したファイルの名前を ENV に 行します。したがって、 Korn シェルに対する関数やェイ シェル・プログラムは子フ。ロセスの Korn シェルが実 す。 も、 ENV の値に代入されたファイルの内容を実行しま しておくと、子プロセスとして起動された Korn シェル 変数 ENV を子プロセスに継承されるように export たファイルの内容を実行します。 . profile の実行か終了した段階で ENV の値に代入され ログインシェルとして起動された Korn シェルは、 まず、変数 ENV 斷難リを説明します。 変数 ENV アスや関数カ硬えます。 く、ログインシェル以、タ ) Korn シェルでも同し工イリ 2 つのシェルに対する言当をきれいに分けられるだけでな ENV を使うガ去を紹介しましよう。これを利用すると、 た工夫が必要です。そのための手段の 1 っとして、変数 Bourne シェルと . profile を共有する場合はちょっとし です。ただし、これらは Korn シェル特有の機能なので、 ェイリアスや関数も、 . profile に言当すべき事柄の 1 っ 150 $ cat $HOME/ . ksh ます。 function hostname echO Cuname alias ls='ls —F' ーⅡ ENV を使う利点は、ログインシェルとシェル・プロ グラムを実行する Korn シェルとを同じ環竟にする、と いうだけではありません。 Bourne シェルと Korn シェ ルの両方で . pr 。 file を共有するときにも便利です。 Korn シェル固有の機能 ( 関数やェイリアス ) は、 ENV で指 定するファイルに記述して . pr 。 file で ENV を定義し、 Bourne シェル固有の機能も定義しなけれはならないと きは、 . profile に直接言当するか、 . sh などといった名前 のファイルを作って、それを . profile から実行するよう にできるからです。 次刎列を見てください。 case $SHELL in /bin/sh) /bin/ksh) ENV=${HOME}/. ksh ・ export ENV 変数 SHELL には、ログインシェルのパス名が代入 されています。この例では、その値を case で判定し、 /bin/sh (Bourne シェル ) なのか /bin/ksh (Korn シェ ル ) なのかを調べています。結果が /bin/sh であったな コマンド 3 でホームディレクトリの下の . sh を実 ら、 行します ( もちろん、 . sh には Bourne シェルで設定し たい恥頁をしておきます ) 。一方、 /bin/ksh の場合 は、変数 ENV の値として ${HOME}/. ksh を代入しま す。これによって、ログインシェルが Korn シェルであ れば、 . profile の実行カ鮗了した時点でホームディレクト リ下の . ksh の内容力躾行されます。 オートロード関数 関数の定義も . profile にすべき駢丙ですが、これに 関連して、、オートロード関数 " という機能を紹介しておき 3 引数に指定したシェル・プログラムをそのシェルで実行するコマンド。 C シェルの source コマント 1 亥当します。 UNIX MAGAZINE 1996.8
3 特集モーレッ UNIX れています。このほかにも、 jobs コマンドはジョブの状 態を表示し、 xterm は実行中 (Running) 、 xclock は一 時停止中 (Suspended0 SunOS など、 Stopped と表示 される OS もあります ) であることも分かります。 状態を表す文字列の前にある、、 + " や、、一 " は、ジョブの 切替え対象となる順番で、 + の付いたジョブはカレント ジョブ (current 扣 b ) 、 はプレビアスジョブ (previ- ous job) と呼はれます。次に説明するジョブ切替えのコ マンドでジョブ番号を指定しないと、カレントジョブカ髞 作の対象となります。カレントジョブに対して操作をおこ なうと、プレビアスジョブがカレントジョブになります。 さきほどの状態から xcl 。 ck をバックグラウンドに回す には、 2 つのカ 1 去があります。 1 つはシェルの組込みコマ ンドである bg を使う方法で、引数としてジョフ番号を % fg % 2 xclock fg を実行すると対象となるコマンド名か表示され、コマ ンドの終了侍ち状態になります。この例のように、終了待 ちの状態で、、 C - c " を入力すると、コマンドを強制終了さ せることができます 19 あっぷる : へえー いままで付けてた & は、、バックグ えます 17 % bg % 2 [ 2 ] % jobs [ 1 ] Running [ 2 ] + Running xclock & xterm xclock ジョブ番号の直前にある、、 % " はメタキャラクタで、ジョ プ番号であることを示します。 jobs を実行すると、 Sus- pended から Running に変わったことが分かります。 xclock ではあまり動きがないので止まっているのか実行 しているのか分かりませんが、 iC018 などのツールで試す とよく分かります。 もう 1 つの去は、ジョブ番号に、、 & " を指定するもの です。いまの例なら、次のように実行します。結果は同し なので、どちらを使うかは好みです。 [ 2 ] バックグラウンド・ジョブをフォアグラウンドにもって くるには、 fg コマンドを使います。 fg コマンドはジョブ 番号を引数として指定しますが、省略するとカレントジョ プに対して操作をおこないます。 17 上にも書いたようにジョフ番号を孑旨定しなければ、カレントジョブが 対象となります。 18 ワイヤフレームて描かれた立 : 体が、ウインドウのなかを転け回るデモ用 xclock & 36 のツーノレて・す。 ラウンドで実行させる " って意眛だったんですか。謎が 1 っ解けて、ちょっとだけすっきりしました。 monkey: でもな、調子に乗ってコマンドをたくさん実 行すると、えらい目に遭うこともあるで。たとえば、 Suspended 状態のままログアウトするやろ。すると、 Suspended 状態のコマンドは強制的に終了させられる あつぶる : するとどうなるんですか ? monkey : 工デイタて扁集途中のファイルがあって、そ れを Suspend したのを忘れてたとするやろ。その状態 でシェルを終ると・ あつぶる : あ、そうか。ファイルを保存してなかったら、 変更が台無しになっちゃうんですね ? monkey : ご名答。ただ、 Suspended 状態のコマンドが あるときにシェルを終了しようとすると、「停止中のコ マンドがあるで」って怒りよるから分かるけどな。 X だ と xkill コマンドなんかで終了できるから、気いつけな あかん。 あつぶる : 停止中のコマンドは分かりましたけど、 ノヾック グラウンドで実行中のコマンドはどうなるんですか ? monkey : X のコマンドだと、 X サーノヾーにリセットか かかった時点で終るから問題ない。そうでないコマン ドは、ログアウトしても実行し続けるんや。それを探し て終らせる力法はまた教えるから、とりあえす次に進も ヒストリー機能 C シェノレでいう ヒストリーとは、ユーザーが入力したコ マンド行の履歴です。ヒストリー機能をオンにすると、過 19 コマンドの弓竝冬了には kill コマンドを使うこともできますが、プロセ スの話とあわせて次可筆呂介します。 UNIX MAGAZINE 1996.8
UN Ⅸへの招待盻 レクトリにもコマンドが置かれています。このディレク トリは、使用するマシンや UNIX のバージョンによって さまざまです。そこで、 . profile ではログインしたマシン の不動リを判定するなどして、変数 PATH を設定する必 があります。 変数 PATH の設定方法は Korn シェルでも Bourne シェルでも同じですから、己する際はどちらのシェルか を意識する必喫はありません。なお、ファイル麦方で実 行するコマンドのことも考えて、 PATH の設定は . profile の知頁ちかくでおこなうはうがいいでしよう。 パターン 1 ) マシンの不動リの判定 ログインしたマシンによって変数 PATH 刎直を変え る場合、ます、、いまログインしたマシンは何か ? " を判別 しなければなりません。これにはいくつかのガ去があり ますが、 ・ホスト名 ・マシンのアーキテクチャ などをもとに判別するのが一ヨ勺でしよう。前者は host- name (SunOS や BSD 系 ) や uname (SystemV 系 ) コマンドで、後者は arch (SunOS や BSD 系 ) や u- name (SystemV 系 ) コマンドで調べます。どちらの方 法を選」、は、皆さんの好みや竟 ( マシンの不頁やホス トの数のバランス ) などて決めればいいでしよう。 いすれにせよ、ホストやマシンを判別し、その結果に応 して変数 PATH を定義します。 リスト 1 に、 PATH 言聢の例を挙げます。こ刎列では、 1 ~ 18 行目でマシンのアーキテクチャを調べ、結果を変 数 MACHINE に代入しています。つまり、アーキテク チャごとに PATH の値を決定していく方法をとってい ます。 OS によっては、ログイン時に変数 MACHINE や machine にマシンのアーキテクチャ名が自動第勺に代入さ れるものがあります。 1 ~ 6 行目は、そのようなケースに 対応したです。 マシンのアーキテクチャを調べるコマンドは、すべて の UNIX で共通というわけではありません。 /bin/arch 、 /usr/ucb/arch 、 /bin/uname などのようにさまざまで す。そこで、 7 ~ 15 行目では if と test([) —r を使い、各 パターン 2 ) case 文字列 in できる機能をもっています。 列 " の、、パターン " によって実行する、、コマンド " を選択 ルの case—esac コマンドは次のように使用し、、文字 変数 PATH は、 20 ~ 54 行目で設定しています。シェ ります。 た言己です。このとき、 MACHINE は unknown にな 17 行目は、どのケースにも該当しなかった場合を想定し CHINE にアーキテクチャの値を代入しています。 16 ~ コマンドがあるかどうかを調べながら実行し、変数 MA- コマンド コマンド 148 リスト 1 ではこの機能を利用して case で変数 MA- CHINE の値を判定し、その値ごとに PATH 刎直を代 入しています。 PATH の言聢力法は、これ以外にもたくさんあります。 これより優れたガ去もあるはずですから、皆さんも考えて みてください。 なお、 55 行目で使っている export コマンドは、 export 変数 または export 変数 = 値 という形式て使い、引数て指定した、変数 " をそのシェル から起動するすべてのプロセスに継承させるためのコマ ンドです。すべての変数を継承させる必要はありません が、子プロセスに必要な、たとえば次のようなものは ex- port しておくべきです。 PATH : 子プロセスによるシェル・プログラムの実行や make によるコマンド実行に必要。 ENV : シェル・プログラムで、ログインシェルと同し 関数や工イリアスを使うために必喫。 UNIX MAGAZINE 1996.8
3 モーレッ UNIX f00 : 特集 Fi1e exists . > の代わりに > > を使うと、指定したファイルの後ろに出 力を追加します。指定したファイルか存在しない場合の動 作は > と同じですが、 noclobber をセットしておくと「そ んなファイルはないで」というエラーになり、ファイルは 作成されません。 標準工ラー出力のリダイレクション 標準出力のリダイレクションではエラーメッセージまで はファイルに言求されません。 C プログラムのコンパイル などをおこなっていると、標準出力に表示される実行結果 とともに、エラーメッセージもファイルに保存しておきた い場合があります。 > & と > > & というメタキャラクタを使うと、標準出力と標 準ェラー出力の両方カ甘旨定したファイルに切り替えられま す。 > と > & の違いをくらべてみましよう。 ls : mai13. txt : ma 土 11. txt % cat f00 maill . txt % cat f00 ls : mai13,txt : % ls maill . txt NO such file or directory % ls maill . txt mai13. txt > & f00 NO such file or directory mai13. txt > f00 UNIX MAGAZINE 1996.8 ンドの出力を別のコマンドの入力につなげるものです。 C もつ機能ですが、 、、パイプ " の名が示すように、あるコマ ておきましよう。これはシェルではなく UNIX 自体が 入出力の切替えに勵里した機能として、パイプも紹介し パイプでつなぐ 出力が追加されます。 なお、 > > & を使うと、 > > と同しようにファイルの後ろに になります。 > & を使うと、エラーメッセージも foo に出力されるよう れ、エラーメッセージは端末に表示されています。一方、 ると、 maill . txt というファイル名だけが f 。。に出力さ います。 > を使って foo というファイルにリダイレクトす txt) と存在しないファイル名 (mai13. txt) を指定して この例では、 ls の引数として存在するファイル (maill ・ シェルにかぎらす、多くのシェルでパイプは一という 記号で表さこの左右にコマンドを指定します。 たとえは、パイフ。の左側にどんなユーザーがコンピュー タを使っているかを調べる who コマンドを、右側に wc というコマンドを使ってみましよう。 wc はファイルを入 力として受け取り、ファイルの行数と単語数、さらにファ イルの文字数 ( バイトを表示するコマンドです 15 % who monkey ttypl ttyp2 appl e sarumata ttyp3 % who ー“ Ju1 1 10 : 19 Ju1 1 10 : 41 Ju1 1 10 : 54 125 (umpc : 0. の (umpc:O. 0) (umpc:0.0) 3 18 who は実行結果であるユーサーのリストを、標準出力 に送ります。ふつうなら端末に表示されるのですが、パイ プを使うとそれがそのまま wc の入力に送られ、 wc が処 理をおこなってから端末に表示されます。ここでは 2 つ のコマンドを 1 個のパイプでつないだだけですが、複数の コマンドを、 C07 れ 7 れ佖れ d ー C07 れ 7 〃 0 れ d ー C07 れ ? 71 佖れ d ー のようにどんどんつなぐことができます。 UNIX のコマンドが単純なのは、パイプで組み合わせ れは複雑な作業がおこなえるため、 1 つのプログラムにた くさんの機能を詰め込まなくてもいいからです。パイプを 使ってコマンドを組み合わせることにより、自分て新たな コマンドを作成しなくても目的を達成できます。 工イリアス あつぶる・ (monkey 君が rm コマンドでファイルを消 すのを見ながら ) なんで rm コマンドを使うと、「ファ イルを消してもいい ? 」って石忍メッセージが出るんで すか ? 私が使うといきなり消えちゃうのに に嫌われてるのかしら ? monkey : それはな、あっふるちゃんがまだ初心者やか ら、マシンにナメられとるんや。だんだん上達してく ると、マシンも「こいつ、ただもんやない」って、下 手に出るように ・・ちゅうのは冗談で、 rm コマンド ー i " オプションを指定してるだけや。こいつを使う 15 ファイル名を省略すると、標準入力からデータを受け取ります。 33