Unixは
のシステムである。たった一台のコンピュータでも、Unixの動いているもので あれば、同時に何人もが利用することができる。一台のコンピュータを利用す るためには、コンピュータをこれから誰が使うかを宣言する必要がある。 「これから使います」の宣言のことをログイン、「これでやめます」 の宣言のことをログアウトという。
|
→ |
|
→ |
|
ログインをするときに必要なのが
の対である。ユーザには、
があり、一般ユーザでは、システムの根幹に関る操作はできないようになっ ている。「スーパーユーザ」は特権ユーザであり、システムに関する全ての操 作を行なうことができる。通常利用する場合「一般ユーザ」としてログインし て作業する。
パスワードは、Unixシステムを利用する上での通行手形である。これは自分 がUnixマシンを使うために重要である。他人に漏らさぬよう十分に注意する必要 がある。パスワードが破られてしまうことは、自分だけに被害がとどまらない。 もし、自分のパスワードを利用してシステムに侵入した人間がいたとしたら、他 人が自分の権限で次の悪事を働くことが容易にできてしまう。侵入者(クラッカー) がひとたびシステムにログインできてしまえば、システム内部の情報の多くを手 に入れることができる。場合によっては、管理者のパスワードを破るためのヒン トを手に入れることができ、システム全体を乗っ取ることも可能になってしまう 恐れがある。
「自分はたいした情報を保存していないから…」などと、自分のパスワード に簡単なものを付けていたり、同じパスワードを複数のサービスで使い回す人が いるが、これは絶対に避けなければならない。自分だけでなく、他人にも被害が およぶことの無いようパスワードは推測されにくいものを選び、 誰の目にも触れないよう保存することが重要である。
「良いパスワード」とは、
を指す。多くのシステムではパスワードに英数字記号が使える。
パスワードが5、6文字のものでは、現在のコンピュータ能力を持ってすれば、 総当たり方式でも短時間に破る ことができてしまう。 必ず10字程度以上のものを付けるように心掛けたい。
ユーザ名とパスワードを正しく入力するとログインできる。ログインすると シェルが起動される。シェルはユーザからのコマンド入力を受け付け るプログラムで、ユーザはここに色々なコマンドを入力してさまざまなアプリケー ションを起動する。まずはログインしてみよう。システムによってログイン画面 は異なるが、いずれの場合もユーザ名とパスワードのペアを 入力することを求めている。
NetBSD/i386 (tmax.yk.gentei.org) (ttyE0) login: yuuji (←ユーザ名) Password: (入力した文字は表示されない)
パスワード認証に通過するとユーザにはシェルと呼ばれるプロセス が与えられる。シェルの種類や設定により細かいところは異なるが、
tmax%
あるいは
tmax$
といった、%や$がカーソルの直前に出ている画面が現れ る。カーソルの直前に出ているこの文字列をプロンプトと呼び、これ が現れているときは任意のコマンドを呼び出すことの出来る状態であることを示 している。例にコマンドを入力してみよう。
tmax% ls [Return]
キーボードから l(エル) s(エス) と打ち、[Return]キー を押すと画面に何かが出力される。lsコマンドは、存在するファ イルのリストを出力するコマンドである。他にも色々なコマンドを利用することが できる。。ここでは、一度ログアウトしよう。キーボードから logoutと入力し、[Return]を押そう。。Unixマシン上で の全ての作業を終了して、次の人が利用できるようにする。
素の状態のUnixでは一つの画面で一つのシェルしか起動しない。この状態で もシェルの持つジョブ切替え機能を使うことで複数のプログラムを同 時に起動できるが、単一の画面で作業し続けるのは大変なので、現在では複数の ウィンドウを切替えて視覚的にも同時に複数のアプリケーションを利用できるよ うなウィンドウシステムを通場利用する。Unixで主に利用されてい るウィンドウシステムはX Window System(以下X)という。
Xそのものが提供する機能は、画面にウィンドウを表示したり、マウスを動か すとそれに対応してポインタを動かすなどの、基本的なものだけである。 MS-Windowsなどでは、ウィンドウのタイトルバーの位置や、×ボタンの位置、押 したときの動作などが決められているが、Xではそのようなユーザインタフェー スの部分までは決められていない。そのようなユーザインタフェースはウィ ンドウマネージャと呼ばれるソフトウェアが提供する。ユーザは好みの ウィンドウマネージャを選ぶことで、自分のX環境を構築できる。このようなこ とから、Unix+Xを利用している場合、人により全く違う見栄え(ルック& フィー ル)になり、この点はWindowsやMacを使っているのとは違う。
101教室で利用している環境は、FVWM2というウィンドウマネージャをベース にしたものである。今目にしている画面のデザインはFVWM2固有のものだが、配 色などは個人で自由に好きな色に変えることができる(これらの例は www.fvwm.org/screenshots/ で見ることができる)。
Xを利用すると、複数のウィンドウを切り替えて使うことができる。このとき に意識しなければならないのはフォーカスという概念である。マウス カーソルを動かすと、マウスの入っているウィンドウの枠の色が変わる。マウス を合わせて色が変わった状態のウィンドウをフォーカスの合った ウィ ンドウといい、全てのキー操作はこのウィンドウの中で動いているプログラムに 対して送られる。
(標準状態の)Windowsでは、常に最前面のウィンドウにフォー カスが合っているが、X(の上で動くウィンドウマネージャ)では必ずしも そうではない。(マウスカーソルを動かして)フォーカスさえ合わせておけば、下 に隠れているウィンドウにキー入力を送ることも可能である。
隠れているウィンドウにフォーカスが合っている例
これにより、何かのウィンドウを最前面にして、そこに書いてあることを参 考に裏のウィンドウに文章を書き込む、といったことが可能になる。
キーボードから操作する場合は、必ず操作したいウィンド ウにマウスカーソルを入れる事を忘れないように気をつける。フォーカ スを合わせたウィンドウを最前面にしたいときは、そのウィンドウのタイトルバー を左ボタンでクリックする。
※ Windows風に常にフォーカスの合ったウィンドウを最前面にする事が可能なウィ ンドウマネージャもある。FVWM2でもその設定が可能である。
Unixに限らず、多くのコンピュータシステムを使う上で理解しておく必要が あるのがファイルシステムの構造である。ファイルシステムとは、ハー ドディスクなどの補助記憶装置上にファイルを格納して行くときの仕組みをいう。 Windowsのファイルシステムも、もともとUnixを手本として出来上がったもので、 同様のツリー構造を取っている。ただし、Windowsでは単一の木構造で はなくハードディスクの増設や、CD-ROM、MOドライブなど違う種類のドライブに 応じて別の木構造単位で管理することになる。たとえば、基本ファイルシステム は「C:ドライブ」になっていて、以後増えた領域は「D: E: F: ...」のように順 次別のドライブとして存在することになる。
Unixではアクセスできるファイルやディレクトリは必ず一つのファイルシス テムの木構造配下に属している。Unixファイルシステムの最も根っこに当たる ルートディレクトリは/(スラッシュ)で表す。
ファイルシステムツリー
MS-DOSやWindows と違い、Unixではファイル名の 大文字と小文字は違うものとして扱う。たとえば、
foo.txt
FOO.TXT
という二つのファイルは全く違うものとして扱われる。
UnixでもWindowsでも、色々なアプリケーションプログラムを起動して色々な 仕事をする。仕事をした結果はどんな形式にせよ、どれかのファイル に保存する。あるいは、以前作成したファイルを参照することで次の仕 事ができるようになる。このように、コンピュータを使う場合はファイルを 読み書きすることが不可欠となっている。Unixでもプログラムを起動するとき に、そのプログラムに与えるファイルを指定することが重要になる。
先程のファイルシステムツリーの図の一番上にあるルートディレクト リにあるファイルは、スラッシュで書きはじめて表す。たとえば、ルー トディレクトリにある netbsd というファイルは、 /netbsd と指定する。ルートディレクトリの更に下のディレ クトリはディレクトリ名を順次/(スラッシュ)で区切って表記し て行く。たとえば、
ルートディレクトリにある usr ディレクトリの中にある local というディレクトリ
は、
/usr/local
と指定し、
ルートディレクトリにある usr ディレクトリの中にある local というディレクトリの中にある bin というディ レクトリの中にある ncftp というファイル
は、
/usr/local/bin/ncftp
と表記する。
Unix上で起動しているプログラムは全てカレントディレクトリとい うものを持っている。これは、そのプログラムがファイルシステム上のどの位 置に存在しているかを意味する。たとえば、シェルのプロンプトから pwdと入力し、[Return] をタイプしよう。
% pwd
/home/irhome/c101/c101512
ここで出力されたディレクトリ名がシェルプロセスの持つカレントディレク トリである。シェルから起動されるプログラムはすべてシェルのカレントディレク トリを継承した状態で始まる。
ファイルを指定する方法に話題を戻す。Unixファイルシステムでは「カレン トディレクトリ」は . (ピリオド)で表す。また、「ひとつ上のディ レクトリ」は .. (ピリオド二つ) で表す。これらを利用して、
今いるディレクトリの foo.tex というファイル
は
./foo.tex
と指定し、
二つ上のディレクトリの lib というディレクトリ
は
../../lib
と指定する。また、多くの場合カレントディレクトリのファイルやディレ クトリを指定する場合の単一のピリオドは省略できる。たとえば、 lessというコマンドに、カレントディレクトリにある hoge というファイルを与えたい場合は
% less hoge
とする。もちろん、less ./hoge としても構わない。
システムにアカウントを持つユーザがログインしたときに最初に置かれるの がホームディレクトリである。各ユーザはこのディレクトリを起点とし て、その中に自由にファイルを置いたり、新たなディレクトリを作っていくこと ができる。
ホームディレクトリは何度も行き来することが多いので、多くのシェルでは、
ホームディレクトリのパス名を ~
(チルダ)一文字で表せるように
なっている。たとえば、ホームディレクトリにある foo.txt
と
いうファイルは、~/foo.txt
と短く表記できる。また、他のユー
ザのホームディレクトリも
~ユーザ名
で表せる。たとえば、ユーザ名が taro という人のホームディレクトリを
表したい場合は、~taro
と書くことができる。
もし、個人でずっとUnixシステムを利用して行く場合、システムを利用する 上で作成したメイルやドキュメントなどは、全てホームディレクトリ以下に作ら れて行くことになる。したがって、ログインするマシンを新しくした場合でも、 自分のホームディレクトリ以下のファイルをまるごとコピーするだけで、それま で使っていたファイルを全て移行することができる(もちろん新しいマシンいに も以前使っていたアプリケーションプログラムがインストールされていることが 必要)。いっぽうWindowsでは、「ホームディレクトリ」という概念がなく、ユー ザのデータや個人設定を「レジストリ」や、アプリケーションプログラム固有の ディレクトリに保存したりと、一貫性はない。ユーザの分からないところに 保存するので、新しいコンピュータに移行するときは、使っているソフトウェア ごとに個人設定などを保存している場所を調べ、ひとつひとつ移行しなければな らない(そして大抵それはとても面倒なので、また最初から個人設定し直すこ とになる)。
ところで、Unix系システムで動くソフトウェアでは、ユーザの持つファイル をほとんどの場合「テキスト形式」で管理する。テキスト形式のファイルは、専 用ソフトウェアがなくても読むことができる。逆に、特定のワープロやデータベー スといった、アプリケーションプログラム固有の形式ので保存されたファイルは そのプログラムがなければ読むことができない。10〜15年前にワープロで作った 文書があったとして、それを今読むことができるか考えてみるとよいだろう。当 時のワープロは現在存在するだろうか。同様に、現在文書やメイルを書くのに 使っているアプリケーションプログラムが15年後に存在するか想像してみよう。
テキストファイルは、Unixが生まれたときから現在まで、30年以上変わらぬ 形式で存在しつづけている。
いままで何のことわりもなく、「コマンドを起動」する場合はそのコマンド をプロンプトの直後に書いていた。プロンプトの直後のコマンドを入力する 行のことをコマンドラインといい、ここにコマンドとそれに与えるオ プションを入力して行く。コマンドラインに入力するもっとも単純な構成は、 最初の単語に実行すべきコマンド名を書き、その後にスペースで区切った 引数(ひきすう)を列挙するものである。
% コマンド 引数1 引数2 引数3...
Unixのコマンドには色々あるが、それらの多くはファイルなどの作業対 象を引数として与えて仕事をする。たとえば、先程の例の
less hoge
で呼び出した less
コマンドはテキストファイルの中味を一画
面ずつ読むためのものである。このコマンドに与えている hoge
は
ファイル名ということになり、結果として less hoge
とすること
で hoge
というテキストファイルの中味を読むことができる。
複数のファイルを与えることもできて、
% less hoge fuga
とすると、読みたい対象として hoge, fuga
二つのファイルを
指定することになる。
また、場合によって次のように起動することもある。
% less -i -s hoge
ここで与えた -i -s
は処理対象のファイルではなく、
less
コマンド自体の挙動を変更するための引数で、一般的には
オプションと呼ぶ。あくまで慣習によるが、多くのコマンド
はハイフン(-
)で始まる短い文字列によって挙動を変えることがで
きる。また、場合によっては複数のオプションをひとつのハイフンにまとめる
ことができる。less
の場合はまとめることが可能で
-i -s
は -is
とすることもできる。つまり、
less -i -s hoge
と
less -is hoge
は同じ意味になる。コマンドにより、オプションをまとめることができ ないものもあるので、具体的にどのようにオプションが指定できるかは利用する プログラムごとに覚える必要がある。
走行中のプログラムを一時停止したり、強制中断することができる。
プログラム走行中にC-cをタイプすると即座に実行を停止 できる。プログラムの正当な終了方法ではないので、強制終了したい場 合に利用する。
※ プログラムによってはC-cによる割り込みを無視したり(こ の場合C-cでは止められない)、正当な後処理を行なってか ら終了するように作ってあるものもある。
時間のかかる処理を途中で止めてみよう。次のコマンドを実行し てみること。画面にたくさん出力されるので、[Return]を押した らすぐにC-Cをタイプできるように準備しておく。
% du -k /usr
2 /usr/lib/sparcv9/gss/gl
114 /usr/lib/sparcv9/gss
19738 /usr/lib/sparcv9
1443 /usr/lib/lp/locale/en_US.UTF-8/mp
2266 /usr/lib/lp/locale/en_US.UTF-8/xutops
3710 /usr/lib/lp/locale/en_US.UTF-8
56 /usr/lib/lp/locale/C/mp
57 /usr/lib/lp/locale/C
:
:
:
するすると画面が流れて進んで行ってしまうので、急いで
C-cを押して止める。ちなみに画面に表示されるのは、
/usr/
ディレクトリ以下にある全てのディレクトリと、その
使用量(単位KB)である。
中断ではなくて一時停止することもできる。プログラム動作中に
C-zを押すと一時的にプログラム停止状態になる。時間の
かかる処理の例として、もう一度、du -k /usr
を起動して
みよう。今度は [Return] を押したら、C-z
を押す準備をしよう。
% du -k /usr 2 /usr/lib/sparcv9/gss/gl 114 /usr/lib/sparcv9/gss 19738 /usr/lib/sparcv9 : : 1443 /usr/lib/lp/locale/en_US.UTF-8/mp 2266 /usr/lib/lp/locale/en_US.UTF-8/xutops 3710 /usr/lib/lp/locale/en_US.UTF-8 56 /usr/lib/lp/locale/C/mp 57 /usr/lib/lp/locale/C ^Z (←ここで C-z を押す) zsh: suspended du -k /usr %
C-zを押すとプログラムが止まり、シェルプロンプトに戻 る。一見C-cで止めたときと同じように見えるが、今度はプ ログラムを再開できる。次の「ジョブ制御」で解説する。
ひとつのプログラムを起動してから終了するまでの動作中の過程のことを
プロセスという。走行中のプロセスをC-zで止めると、
そのプロセスは停止状態 (サスペンド状態) になる。
プログラムをC-zで止めたあとで、jobs
と入力して
みよう。
% jobs
[1] + suspended du -k /usr
jobs
コマンドで表示されるのは、シェルの持っている
ジョブの一覧である。もうひとつジョブを起動してみよう。
viというコマンドを起動してすぐにサスペンド(C-z)する。
% vi (すぐに C-z を押す) zsh: suspended vi
ジョブ一覧を見よう。
% jobs
[1] - suspended du -k /usr
[2] + suspended vi
シェルは、何個もジョブを持てるが、そのうちユーザと対話しながら走る ことのできるジョブはひとつだけである。これをフォアグラウンドジョブ という。C-zをタイプすることは、フォアグラウンドジョ ブをサスペンド状態に落とすこと、と言い換えられる。
一方、あるプログラムをシェルの裏で走らせ続けることができる。このよう
なジョブをバックグラウンドジョブという。例を見てみよう。コマン
ドラインからmlterm
とコマンドを打ってみる。
% mlterm (新しいウィンドウが出る)
新しくウィンドウが開き、それまで使っていたのと同じシェルの画面が出て
くる。これはつまり、これまで出ていたウィンドウはmlterm
という
プログラムによるものだったということが分かりる。さて、マウスを利用して、
もともと使っていたウィンドウに戻そう。mlterm
と打ったシェルは、
プロンプトが出ていない。つまり、mlterm
コマンドをフォアグラウ
ンドで動かしていて、それが終わるまでおとなしく待っている状態である。
ここでC-zをタイプしよう。
% mlterm C-z ^Zzsh: suspended mlterm %
プロンプトが戻って来た。ところが、起動したmlterm
のほうは
停止状態になっているので、新しいmlterm
ウィンドウは動かなくなっ
てしまう。マウスを利用して、新しいmlterm
に移ろう。とこ
ろがこれは動かない。
また、古い方のmlterm
に戻り、jobs
してみる。
% jobs
[1] suspended du -k /usr
[2] - suspended vi
[3] + suspended mlterm
ここで、停止状態のmlterm
をバックグラウンド走行させてみる。
これには bg
コマンドを利用する。
% bg
[3] - continued mlterm
%
すぐに次のプロンプトが返りつつも、新しいmlterm
が再度動き
始めていることを確認すること。
シェルの持っているジョブを操作するためのコマンドやキー操作を列挙する。
現在フォアグラウンドで走行中のプロセスにSTOPシグナルを送る。こ れにより、サスペンド状態に移行する(移行しないように作ってあるプロ グラムもある)。
fg
コマンド (フォアグラウンド移行; 再開)
fg
とすると、現在停止しているジョブをフォアグラウン
ドに移行する。ジョブが複数あるとき
% fg %vi
のようにすると、"vi" という文字列で始まるジョブを選んでそれをフォ アグラウンドに移行する。また、
% fg %1
とすると、ジョブ番号 [1] のジョブをフォアグラウンドにする。こ
のような % を利用したジョブの選択指定方法は、以下で説明する
bg, kill
でも同様に利用できる。
bg
コマンド (バックグラウンド移行)
ジョブをバックグラウンドに移行して走らせる。引数にジョブを指
定しなかった場合は「現在のプロセス(jobs
コマンドの一覧
で+
記号の付いているもの)」を選んだものとみなす。
kill
コマンド (ジョブの中断)
必ずジョブを指定して、そのジョブに(終了)シグナルを送る。
&
指定 (プログラム起動時に指定)
コマンドラインでプログラムを起動するときに、最初からそのプロセ スをバックグラウンドで走らせることを指定できる。たとえば、
% mlterm &
とすると、新しいmlterm
コマンドを最初からバックグラ
ウンドで起動する。
これから色々なコマンドの使い方を覚えていkuga、最初にコマンドのオンラ
インマニュアルを読むコマンドを覚えておくと良い。
man
コマンドがマニュアルを表示するためのもので、
man コマンド名
のように起動する。たとえば、
% man ls
とすると、ls
コマンドの使い方の説明が表示される。シス
テム標準のコマンドには必ずマニュアルが付属すru。こまめに
man
コマンドを起動して使い方を調べるようにすると良い。
さて、コマンドラインの最初の単語で「コマンド」を指定していたが、コマ
ンド自身もファイルシステム上の「ファイル」として存在している。したがって、
本来は「コマンド」の部分も絶対パス指定などを用いて指示しなければならない。
たとえばemacs
というコマンドは
/usr/koeki/bin/Emacs
というディレクトリに存在するので、これ
を起動したい場合は
% /usr/koeki/bin/Emacs/emacs
のように指定しなければ、システムはコマンドの位置を特定できないはずで ある。しかし、実際には
% emacs
とだけ打てばコマンド(ここではemacsコマンド)が起動する。こ れは、シェルがコマンドの存在しそうなディレクトリをあらかじめ(何個も)覚え てくれているので、ユーザはコマンドの名前だけ叩けばその登録したディレクト リから探し出して来てくれる。この「登録したディレクトリ」のことを コマンドサーチパスといい、実際にはユーザがあらかじめ指定してお く。現在のコマンドサーチパスを知るには、コマンドラインで以下のように 実行する。
% echo $PATH
/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/etc:/usr/koeki/etc:\
/usr/koeki/texlive/bin:/usr/local/bin:/usr/local/sbin:/usr/k\
oeki/bin:/usr/koeki/bin/AUDIO:/usr/koeki/bin/CAAM:/usr/koeki\
/bin/CONDA3:/usr/koeki/bin/Emacs:/usr/koeki/bin/GEOLOCAL:/us\
r/koeki/bin/GIS:/usr/koeki/bin/GIT:/usr/koeki/bin/GNU:/usr/k\
oeki/bin/KOEKI:/usr/koeki/bin/MATH:/usr/koeki/bin/NET:/usr/k\
oeki/bin/Ruby:/usr/koeki/bin/Ruby27:/usr/koeki/bin/Ruby31:/u\
sr/koeki/bin/TEXT:/usr/koeki/bin/TeXLive:/usr/koeki/bin/PKG:\
/usr/koeki/bin/PY27:/usr/koeki/bin/PY309:/usr/koeki/bin/PY31\
0:/usr/koeki/bin/Python
(註: 行末の\
の部分で折り返している)
$PATH
は環境変数PATH
に登録されてい
る値に相当する。環境変数とは、Unixシステム上で動作するプログラム群にユー
ザの個人設定などの比較的長期に渡って有効な(ログインしている間ずっと共通
の)情報を保持している変数である。単なる変数なので、どんな名前の変数を作っ
ても構わないが、そのうちPATH
という名前の変数は、コマンド
サーチパスを覚えさせておくために使う、特別な変数である。
PATH
変数の値をもう一度見てみよう。コロン
(:
)で区切られた各パス名がコマンドサーチパスのディレクトリ一
覧である。シェルのコマンドラインで、コマンド名をディレクトリ名なしで呼び出
した場合、これらのディレクトリの中に一致するものがあればそれを起動してく
れる。たとえば、上記の例のように
% emacs
と起動した場合を考えてみる。シェルは、コマンド名にスラッシュが含まれ
ていない場合は、そのコマンドをコマンドサーチパスから探し出して来る。そこ
で$PATH
を見てみよう。
まず、$PATH
の途中に登録されている/usr/koeki/bin
ディレクトリを調べる。このディレクトリにあるファイルを調べてみよう。
% ls -F /usr/koeki/etcX11/ lightdm/ profile.d/ rc.koeki.main caltab mkwallpaper-xml.sh* rc.koeki.d/ sudoers.d/
ls
コマンドに与えた -F
オ
プションは、一覧表示する各ファイルの種類に応じて、(ファイル名の直後に)
分かりやすい記号をつけよ、という意味を持つ(man
コマンド
を利用して調べてみよう)。実行ファイル(つまりプログラム)の場合はその
ファイル名の直後に*
(アスタリスク)を、ディレクトリの場合は
/
(スラッシュ)を付けてくれる。たとえば、上記リスト中の
mkwallpaper-xml*
というのは、
ファイル名が mkwallpaper-xml
で、そ
のファイルが実行ファイルであることを意味している。同様に、
X11/
は X11
という名前のディレクトリ
であることを意味している。
どうやらこのディレクトリには、emacs
というプログラムは無
いようである。つぎの /usr/koeki/texlive/bin
ディレクトリを見てみよう………
ここにも見当たらない。これを繰り返し、……、
/usr/koeki/bin/Emacs
ディレクトリを見てみよう。
% ls -F /usr/koeki/bin/Emacs/cmew* emacs@ etags* mew-pinentry* mewencode* smew* ctags* emacs-28.1* fwdevince* mewcat* mewest* ebrowse* emacsclient* incm* mewdecode* mewl*
やっと発見できた。emacs@
と書いてあるのが emacs
コマンドである。
※ 末尾の @
記号は、シンボリックリンク を意味する。
シンボリックリンクとはひとつのファイルを別の名前で参照するために作ら
れたファイルである。
長くなったが、やっと emacs
コマンドが見つかった。
/usr/koeki/bin/Emacs/emacs
が起動され、
我々が使うことができる。
「ワイルドカード」というとピンと来るかもしれない。シェルの上で、い くつものファイルをまとめて簡単に指定する方法がある。何種類かの記号を 使って、ファイル名が特定のパターンにマッチするもの全てにマッチさせること をグロッビングという。グロッビングに使用できる文字を メタキャラクタといい、以下のものがある。
*
0文字を含めた全ての文字列にマッチする
?
1文字の任意の文字にマッチする
[……]
大括弧の中に列挙した文字のどれかにマッチする
[a-m]
のようにハイフンでつなぐと「aからmのどれか」
という意味になる
すこし例を示そう。あるディレクトリに以下のようなファイル群があっ たとする。
% ls -F
Canna@ bunzip@ ncftpbatch@ safe_finger*
Emacs@ bzip* ncftpbookmarks@ sudo*
GCC@ c_rehash* ncftpget@ tcpd*
GNU@ conf* ncftpls@ tcpdchk*
Graphics@ gimp* ncftpput@ tcpdmatch*
ImageMagick@ lftp@ ncftpspooler@ top*
NETPBM@ lftpget@ openssl* try-from*
X11R6@ ncftp@ rsync* vim@
「cで始まるファイル全て」を ls -lF
する。
% ls -lF c*
-rwxr-xr-x 1 root 3350 Jan 30 23:46 c_rehash*
-rwxr-xr-x 1 root 473 Jan 31 02:36 conf*
c_rehash, conf
の二つのファイルだけが選ばれた。
ls
に与えた l
オプションは、ファイルのサイズや作
成時刻などを含めた詳細表示(ロングフォーマット)をするためのものである。
こんどはGで始まる3文字のファイルを表示してみよう。文字数が決まっ
ている場合は ?
を使う。
% echo G??
GCC GNU
ここで利用した echo
コマンドは、与えられた引数をそのまま
画面に出力するものである。echo
コマンドを使うと、メタキャラク
タを利用してたくさんのファイルをマッチさせるときに、どれにマッチしている
かを確認するのが容易になる。
ncftpという名前で始まるもののうち、ncftpより長いファイル名のものを表
示してみよう。このようなときは ? と *
を組み合わせると
うまく行く。
% echo ncftp?*
ncftpbatch ncftpbookmarks ncftpget ncftpls ncftpput ncftpspooler
最初の ?
が「任意の1文字」を要求するので、すくなくとも
"ncftp" の次に何か1文字以上の名前がついていなければならない。その直後
に*
がくるので、それ以上の長さのファイルならどれでもマッチす
ることになる。
「大文字で始まるファイル全て」はどうだろう。文字の種類を限定する場 合は大括弧を利用する。
% ls -lFd [A-Z]*
lrwxrwxrwx 1 root 12 Jan 31 01:42 Canna -> ../Canna/bin/
lrwxrwxrwx 1 root 12 Jan 31 02:49 Emacs -> ../emacs/bin/
lrwxrwxrwx 1 root 10 Jan 30 10:25 GCC -> ../GCC/bin/
lrwxrwxrwx 1 root 10 Jan 31 00:16 GNU -> ../gnu/bin/
lrwxrwxrwx 1 root 15 Jan 31 02:07 Graphics -> ../graphics/bin/
lrwxrwxrwx 1 root 18 Feb 18 17:53 ImageMagick -> ../ImageMagick/bin/
lrwxrwxrwx 1 root 13 Jan 31 13:32 NETPBM -> ../netpbm/bin/
lrwxrwxrwx 1 root 12 Jan 31 01:26 X11R6 -> ../X11R6/bin/
大文字は、「A〜Zのどれか」なので、[A-Z]
と指定し、2文
字目以降は何でも良いので *
でマッチさる。
以上の例では、ls
や echo
コマンドを利用した
が、グロッビングはそれら以外どんなコマンドとも組み合わせて使うことができ
る。
Unixを効率良く利用できるかどうかは、標準入出力をうまく利用で きるかどうかにかかっていると言っても過言ではない。一言で形式的に言っ てしまうとこうなる。
プログラムがデフォルトでデータを読み込む入力元
プログラムがデフォルトでデータを吐き出す出力先
たとえば、sort
というコマンドを起動してみよう。
% sort hello unix koeki-u [C-d]
sort
コマンドを起動したら、入力待ちになる。すぐ次の行
から続けて、hello, unix, koeki-u
と三つの単語を一行に一つず
つ打ってみる。koeki-u
の次の行にきたら、C-d を
打つ。C-d とは、キーボードの Ctrl キーを
押しながら、dをタイプすることを意味す
る。すると、次のような結果が現れるはずである。
hello koeki-u unix
sort
コマンドは、受け取った一行毎にデータを受け取り、アル
ファベット順(文字コード順)に行を並べ換えた結果を返す。それゆえ
hello, unix, koeki-u
の単語が並べ換えられて、
hello, koeki-u, unix
の順で表示された。
ここで、sort
コマンドが、
なので、標準入力は「キーボード」、標準出力は「画面」だったことがわか
る。今度は、tr
というコマンドを使ってみよう。
コマンドとして tr a-z A-Z
を起動してみる。
% tr a-z A-Z
そうしたら、sort
のときと同じように、
hello, unix, koeki-u
の3単語を1行に1つずつ入力してみる。
hello HELLO unix UNIX koeki-u KOEKI-U [C-d]
今度は少し様子が違う。sort
のときは最後の
C-d を押すまで結果が表示されなかったのに、tr
の
場合は[Return]を押すと即座に結果が返る。既に予想がついてい
るように、tr a-z A-Z
とすると、全ての小文字を大文
字に変えた結果を返す。これも、データはキーボードから与え、結果は画面
に出てきたので、標準入力は「キーボード」、標準出力は「画面」だったことが
わかる。
さて、本番である。今度は、sort | tr a-z A-Z
とコ
マンドを打ってみよう。先ほどの二つのコマンドを|
(縦棒、パイ
プ)でつなぐ。パイプ記号はキーボードで¥マークのあるキーをSHIFTを押し
ながらタイプすると入力できる。
% sort | tr a-z A-Z
これも同じように、hello, unix, koeki-u
を1行に1つずつ入
力し、最後の行の先頭で C-d をタイプしてみよう。以下のようにな
るはずである。
% sort | tr a-z A-Z hello unix koeki-u C-d HELLO KOEKI-U UNIX
sort
コマンドが結果を出力するのなら、hello,
koeki-u, unix
が1行ずつ出てくるはずだが実際はそうではない。
これは、パイプ記号(|
)に、「隣どうしの標準出力と標準入力
をつなぐ」という働きがあることによる結果である。sort
コマンド
を単独で起動した場合は
sort
コマンドの標準入出力
標準入出力は端末と直結している。いっぽう、tr
コマンドと
パイプで繋ぎ、
% sort | tr a-z A-Z
とした場合は、以下のようなイメージになる。
パイプライン
コマンドラインで |
(パイプ)で繋いだ場合、パイプの左側の
コマンドの標準出力と、パイプの右側の標準入力が結合される。この例では二
つのコマンドだけを繋いでいるが、何個でも数珠つなぎできる。
Unixには、標準入力からデータを得て、結果を標準出力に吐き出すように設 計されたコマンドが多数ある。そうしたコマンドを上手に組み合わせること で複雑なデータ処理をたった一行のコマンドラインで行なうことができる。
パイプラインを利用すると、あるプログラムの出力結果を、別のプログラム
の入力に向けることができる。これに類似して、あるプログラムの出力結果を
ファイルに落とすことができる。たとえば、シェルのプロンプトで
cal
コマンドを起動してみよう。
% cal
2002年 4月
日 月 火 水 木 金 土
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
カレンダーが表示される。便利なのでこの結果をファイルにしまっておく。
>
記号を使うと、コマンドの結果の出力先をファイ
ルに振り替えることができる。以下のようにコマンドラインに入力する。
% cal > calendar
画面には何も出力されない。結果は calendar
というファイ
ルに入っている。中を見てみよう。less
コマンドを利用す
るとファイルを読むことができる。
% less calendar 2002年 4月 日 月 火 水 木 金 土 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 calendar (END)
less
コマンドを終了するときは、アルファベットの
q をタイプする。
逆に、コマンドの標準入力を、既存のファイルと結合することもできる。
これは記号 <
を利用する。
% sort < calendar
2002年 4月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
日 月 火 水 木 金 土
sort
コマンドの入力データが、calendar
ファ
イルから供給された。この例は、calendar
出力の行を文字コー
ド順に並べ換えているが、それに意味はない。
ここまででも結構多くのコマンドを打って来たと思う。シェルを使って 作業する場合、何度もコマンドを入力するが、その多くは頻繁に使うものだっ たり、それ以前に何回か入力したコマンドラインだったりする。そうした性質 を利用して入力を効率化する機能がどんなシェルにも備わっている。
101教室環境で利用しているシェルは zsh (Z-Shell)という、現時点で 最も高機能との呼び声が高いシェルである。ここでは、zshで利用できるエイリア ス、関数、ヒストリ機能を紹介する。
コマンド、あるいはコマンドと引数をまとめて、もっと短い単語に置 き換えて利用できる機能がある。
たとえば、ls
コマンドは良く使うが、ファイルサイ
ズやファイルの種別などを見るために -lF
オプションをま
とめて指定することが良くある。このようなときは、ls
-lF
をまとめて短い単語に置き換えて利用できるようにする。
% alias ll='ls -lF'
これにより、以後 ll
と打つだけで ls
-lF
と同じ結果が得られる。
エイリアスは、別名定義したコマンドに引数を与えるときはコマンド
ラインの最後にしか置けない。複雑なコマンドラインの最後以外に任意
の引数を与えられるような別名定義をしたい場合はシェル関数を利用する。
たとえば、cal
コマンドで特定の月のものを表示するには、
% cal 月 西暦年
のように起動する。来月のものを表示したい場合、月だけでなく今 年の西暦年(2002)も指定しなければならず、些細であるが面倒である。
% cal 4 2002
このような場合に月の部分(上記の例なら "4" の部分)だけを指定すれ ば済むような関数を定義してみよう。月(Month)だけ指定すればいい ので、mcal という名前の関数にしてみよう。
% mcal () { cal "$@" 2002 }
このように、
% 関数名 () {
定義内容
}
とすれば関数が定義できる。また、定義内容の部分で、
"$@"
を書くと、その部分に関数起動時に与えた引数が代入
される。
過去に入力したコマンドラインをあとから利用できる。これを ヒストリ参照(履歴参照)と呼ぶ。まずは、以前に入力した コマンドラインを表示しよう。
% history
1 ls
2 ls -F
3 cal | sort
4 sort | /usr/ucb/tr a-z A-Z
5 mcal () {\ncal "$@" 2002\n}
状況により結果は異なるが、記憶されているコマンドラインが番 号とともに表示される。
記憶されているコマンドライン一覧からそのうちひとつを再呼出しで きる。以下のいずれかの方法で呼び出す。
!
に続けてヒストリ番号を指定する。たとえば
% !4
とすると、sort | /usr/ucb/tr a-z A-Z
が実行される。
!-N
(Nは整数)と指定すると、N回前に入力したコ
マンドラインを呼び出す。たとえば、
% !-2
とすると、2回前に呼び出したコマンドラインが実行される。 特別な例として、
% !!
と、!
を続けて指定すると、直前のコマンドライ
ンが呼び出される。
!
に続けて文字列を指定すると、その文字列で始
まる最近利用したコマンドラインが呼び出される。たとえば、上
記の history
状態の場合
% !ls
とすると ls -F
(ヒストリ2番)が呼び出される。
また、!?
に続けて文字列を指定すると、その文
字列にマッチするものが(途中でも可)含まれるコマンドラインのう
ち最近のものを呼び出す。たとえば、
% !?tr
とすると、コマンドライン途中に "tr" の含まれる
sort | /usr/ucb/tr a-z A-Z
が呼び出される。
キーボードでC-pをタイプする毎に、順次ひとつ前 のヒストリに移行して行く。C-nで逆方向に進む。
エイリアスはとても便利な機能だが、現在使っているシェルのコマンドラ
インで定義したエイリアスは、そのシェルを終了(exit
)すると消
滅してしまう。エイリアス以外にも色々便利な設定があるが、ログイン
する度に毎回有効にするにはシェルのスタートアップ(初期化)ファイルに書いて
おく。これらのファイルは、ピリオド(.
)で始まるファイルな
のでドットファイルと呼ぶことがある。
zsh
の場合は、各ユーザのホームディレクトリにある
.zshrc .zshenv .zlogin
ファイルが読み込まれる。全ての
zsh
プロセスで読み込まれるのは.zshrc
ファイルで
ある。ここに、個人の好みのalias定義を書いておけばいつでも利用できる。