コマンドでの操作の基本

コマンド操作の基本

さて,unix の cui 上で操作を行うということはどういうことか解説しておこう.

その仕組みについては後述するが,cui での操作はコンピュータに対して「コマンド」を用いて命令することで行われる.このコマンドには,大ざっぱな文法構造があるので,それを事前に理解しておくとこれからの学習に大いに助けになろう.以下,そのコマンドの文法等について説明する.

命令 (コマンド) の基本的な文法

基本的な文法は,「召使いへの英語での命令」であると思えば良い. 具体的には,

命令形の動詞 副詞 目的語

と並べて命令文を作る,と思えばよい. 実際には,

コマンド オプション 引数

と並べる(間はスペースで区切られる).

オプションとは,コマンドの「動作に変更を加えるためのもの」であり,引数とは,コマンドが「作用する対象」である.つまり,コマンドが (命令形の動詞) に相当し,オプションが (副詞) に相当し,引数が (目的語) に相当すると思えばよい.オプションや引数をどう解釈し扱うかはコマンドに依存するので,後述するオンラインマニュアルで逐次調べる必要がある.しかし,一般にオプションには - (ハイフン,マイナス) を前につける慣例があるので,それは知っておいた方がよいだろう.

コマンド中でよく使われるキー

コマンドを実行したが,用が済んだので終わりたい,よく分からないので止めたい,等の時にどうしたら良いか分からないというときがある. 本来はきちんとマニュアルを読んでそれに従うべきだが,マニュアルが無い,英語で良く分からない等の状況もあるので,そういう時は慣例としてよく用いられている次のようなキー入力を試してみるとよい.

キー 解説
^c 実行中のコマンドを停止する,かもしれない.
^d
or
.(ピリオド)のあとに Enterキー
コマンドが入力を求めているとき,「入力はもう終り」を意味する.
なお、シェルも「入力を求めるプログラム」であるので,
設定によってはこのキー入力でシェル自身が終了してしまうので注意すること.
^g 編集系の実行中コマンドを停止する,かもしれない.
^] 通信系の実行中コマンドの対話実行を停止する,かもしれない.

^ や C- は「Ctrl キーを押しながら」,  M- は「Esc キーを一旦押して離してから」という意味

Unix でよく使われる特別なキー操作に、
「Ctrl キーを押しながら」, 「Esc キーを一回押して離してから」
というものがある.それぞれ、 ^, M- という記号で書かれることが多いぞ.
また、^ の代わりに C- と書くこともあるぞ.いずれにしても頻出するので、覚えておこう.

  操作しても支障のなさそうな範囲で, ガイドなどに出てきたコマンドを試してみて,コマンド操作の雰囲気をつかんでみよう. 具体的には,次の手順で行う. なお,この手順はこの授業での実習の基本なので,端末エミュレータの扱いには慣れておくべし.

  1. 端末エミュレータを起動.
  2. その上でコマンドをタイプし,[Enter] キーを押して入力.
  3. 現れた反応をみて学習.
  4. 以下繰り返し.

端末エミュレータとは

Gnome 端末などの端末エミュレータとは,文字端末と呼ばれる文字しか扱わない端末の「エミュレータ=動作模倣ソフトウェア」の一種である. cui 環境を体感するには端末エミュレータは最も手軽な手段であるので,これからも良く用いる. 同様の文字端末エミュレータには,xterm, rvxt など数多くの種類があるので,自分の好みのものを使うとよいだろう. なお,より「本格的な」cui 環境についてはより後の授業で解説する.


「自分で調べるための」オンラインマニュアル

unix というシステムの持つ文化には,「何事も自分で調べよ」という大人な部分がある. そのため,コマンドには基本的にオンラインのマニュアルが用意されており,そのマニュアルを参照することで使いこなせるようになることが期待される. また,unix のコマンドは長い歴史の中で大勢の開発者が少しづつ追加,改良してきたものなのでその名前から使い方,オプション等はかなり違う (要するにバラバラ). そうした意味でも,各コマンドの目的,動作の詳細,オプションや各種設定の仕方等をオンラインマニュアルから読んでからユーザはコマンドを使うという「流れ」が unix cui 操作の大前提となっている.

オンラインマニュアルで見られるものは,

  • 名称 : 名前と一行程度の簡単な説明.
  • 書式 : オプションや引数をどう並べるか.
  • 解説 : 何をするコマンドなのかの解説およびオプションの説明.
  • 歴史 : そのコマンドにまつわる歴史.
  • 環境変数や設定ファイルについて.
  • 使用例 : 簡単な例. これを最初に見る,というのが実は良い.
  • 関連項目: 関係する,もしくは似たようなコマンドの列挙.ちょっと探している機能と違う,というときはここをよくみる.
  • バグ : バグや使用上の注意点がかかれている.

という感じになっている.

わからなかったらまずマニュアル,という癖をつけておくのが上達への第一歩である. (第二歩目は,「unix に詳しくて教えてくれる知人を見つける」である(^-^)).

オンラインマニュアルに関連するコマンド

コマンド等 機能等解説
man コマンド名 オンラインマニュアル.
与えたコマンドについてのマニュアルを表示する.
何も設定しないと,たいていは英語マニュアルだ.
jman コマンド名 日本語オンラインマニュアル.
与えたコマンドについてのマニュアルを日本語で表示する.
マニュアルの日本語訳が存在しなければ英語のものを表示する.
設定によっては使えない.
(j)man man オンラインマニュアルのマニュアル(^-^).
man もコマンドなので,これはアリなのだ.
マニュアルの使い方についてよく分からない場合はこれを見よ.
(j)man -k キーワード マニュアルデータベースの中からキーワードを含むコマンドを列挙する.
良く分からないがこんな感じ,というコマンドを探したりするのに使う.
xman GUI でのオンラインマニュアル.
存在するマニュアルリストが一覧で見られるなど,結構便利.
英語表示のみなことが多い.
info 主にアプリケーション向けのオンラインマニュアル.
操作方法が一種独特.
一種のハイパーテキスト.

  オンラインマニュアルコマンドを試してみよう. ガイドなどに出てきたコマンドを対象としてマニュアルを調べてみるとよいだろう.

man コマンドの操作で困ったら

man などのコマンドでオンラインマニュアルを画面に出力したはいいが,その後どうやって操作したらよいかがわからないかもしれない. 多くの場合、こうした画面出力は背後で less というコマンドが担っているので,このコマンドの操作方法に従って操作すれば良い. 具体的には,man less などとして調べてみよう.


シェル

aa

unix で cui 操作をしようとすると,実はそこには「シェル」というソフトウェアが既に起動していて,人間の命令 (コマンド) を待ち構えている. 具体的には,gnome端末を起動したとき,

>

$

などという表示がでるが,これはシェルが「何か入力してください」とコマンド入力を待ち受けていることを示している.

基本的に,この「シェル」プログラムを通して人間の文字入力を命令としてコンピュータに伝えるのがunix での cui 操作である. つまり,unix os と人間の間に,シェルが入って両方の橋渡しをしてくれるのである. イメージとしては,シェルは「同時通訳者」もしくは人間の「執事,召使い」と思えばよい. 実際,シェルは細かいことを人間の代わりに覚えておいてくれたり,探し物をしてくれたり,間違ったコマンドを直してくれたり,とまさによくできた召使いといってよい.

結局,unix での cui 操作に慣れるというのは,召使いであるシェルへの命令の仕方に慣れる ということであるともいえる.

ちなみに,シェルにはいろいろな種類があり,好みに応じて好きなものを選ぶことができる. これ以上の詳しい解説はシェルスクリプトを学習するときに行なう.

さて,こうした「二段階を経ての命令」には便利さとは逆に問題も存在する. それは,unix cui での操作には,

  • シェルの操作
  • 対象プログラム自身の操作

という二つのファクターが入ってくるので,この二つのファクターに関する知識が要求されること,問題が起きたとき (特に初心者は) 混乱しやすいという点である.

これは,意識して区別するようにしていけばすぐ分かるようになる. よく分からないときは,自分が困っている原因がどこにあるのかをまずはっきりさせるようにすると解決が早いだろう.

シェルの種類

シェルは数多くあるが,大きく分けて [sh系] と [csh系] との二つに分類できる.

系統 性質
sh系 sh という最もシンプルかつ古いシェルに端を発する.
シンプル.
機械的処理に向く.
対話的処理が分かりにくい.
csh系 C 言語にやや似た文法.
対話的に使いやすい.
シェルスクリプトでやや問題が生じやすい.

[sh系] の比較的新しいものに bash, [csh系] の比較的新しいものに tcsh があるので,そのどちらかを使っておけば良いだろう. また,zsh という非常に強力なシェルも存在するので,興味あるものは一度調べておくのがよい.

元祖 sh に触れる?

今の多くの Unix で sh と称されているものの実体は bash だったりするので、元祖 sh の素朴な機能を実感することは難しい.

シェルの一時変更

シェルも一つのソフトであるので,普通のコマンドとして起動できる. よって,一時的に異なるシェルを使いたいという場合は素直にコマンドとして入力すればよい. その時点から終了させるまで新しいシェルの上で作業ができる. 使っているシェルを終了するには,exit コマンドを使う. イメージとしては,シェルの上でさらにシェルが動く,という感じだ.

ログインシェルの変更

ログインすると自動的にあるシェルがユーザ用に起動し,それ以降ユーザと unix システムの橋渡しをする. これをログインシェルと呼ぶ. ログインシェルはシステムの標準シェルの中から自分の好みのものを選択して変更することができる. ただし,標準シェルとは /etc/shells に登録されているものをいう. 変更方法については後述する.

シェルの機能

シェルスクリプトに関しては後日の講義で解説するので,ここではシェルの対話的利用に関する説明を行なう. また,パスに関しては利用環境のカスタマイズ等の講義で教える. 機能に関しては,各種シェルにより使えたり使えなかったりするうえ,コマンドも異なるため,詳細は調べてから利用するように.

コマンドの入力

シェルへのコマンド入力は,行単位で行なわれる. つまり,キーボードから入力した文字列は,最後に [Enterキー] を押すことでシェルに伝わるのである. 言い換えると,[Enterキー] を押すまではいろいろできるということだ.

連続実行,grouping

コマンド入力の基本は 1行で1コマンド であるが,連続するコマンドを同じ行に続けて書くこともできる.具体的には,

 コマンド; コマンド; …

とコマンドの間に ; (セミコロン) を挟むだけでよい.こうすると,次のヒストリーとのからみで便利なことがある. また,こうした連続実行するコマンドを ( ) で一つのグループにまとめて

 (コマンド; コマンド)

等とすることができる. グループ化された複数コマンドはシェルからは一つのコマンドとして扱われるので,後述のジョブ制御等での動作が変わってくる.

ヒストリー

これまで入力したコマンドを (設定した数だけ) 覚えている機能. 何回も同じコマンドをキーボードから打つより,昔のコマンドを呼び出す方が楽. 使い方は history コマンドや ! 関連を見よ.

コマンドラインの編集

[Enterキー] を押す前なら,入力行を適当に編集できる. どのキーがどのように使えるかはシェルによって異なるが,おそらく矢印キーや emacs キーバインディングは使えるものが多いだろう.

補完

コマンド名やファイル名を入力している時,あるキーを押すと途中で残りの部分をシェルが補ってくれる機能である. 対応するコマンドやファイル名が一つしかない場合はそれ自体で補完し,候補が複数ある場合は共通部分まで補完してくれる. さらにキーをもう一度押すと一覧表が表示されたりする.

ただし,この機能はシェルによってかなり働きが違う. 上の「あるキー」は [Tabキー] か [Escキー] , ^d などになる (シェルによって異なる)が,まずは [Tabキー] を試してみるのが良いだろう.

別名(alias)

自分で決めたコマンド名で異なるコマンドを呼び出すことができる. いつも同じオプションをつけておきたい,コマンドが長すぎるので短いものにしたい,分かりやすい名前にしたい,などの要望に応える機能である. 使い方は alias コマンドを見よ.

ファイル名生成 (ワイルドカード展開)

コマンド中で対応するファイル名を一々全て入力するのではなく,あるパターンを記述することで該当するファイルを指定することができる. 非常に便利なので,是非とも使いこなせるようになるべし.

このパターンを作るための文字とその役割は以下の通りである.

文字 意味, 役割
? 任意の一文字
* 任意文字列 (0文字以上)
[] [ ] 中のどれか一文字. - で範囲指定もできる.
{文字列1, 文字列2,…} {} 中の , で区切られたどれかの文字列.

ただし,ファイル名の先頭にある . (ピリオド) だけは . で直接指定しないと反応しないので注意が必要だ (例外).

ワイルドカード展開の例

以下に、例を示そう. > に続けて書いてあるのが入力コマンド、そのあとがシェルからの返答出力だ.

> ls -Fa

./ .a 00.c a.txt b z.txt
../ .b a abc dummy.html

> echo ???

abc

> echo [a-c]*

a a.txt abc b

> echo {a,z}.txt

a.txt z.txt

> echo *.*     ← 途中にピリオドのあるもの. ファイル名先頭の . には対応しない.

00.c a.txt dummy.html z.txt

> echo *      ← 全て… と言いたいがファイル名先頭の . には対応しない.

00.c a a.txt abc b dummy.html z.txt

> echo .* *   ← 全て… と言いたいがディレクトリの . .. にも反応してしまう.

. .. .a .b 00.c a a.txt abc b dummy.html z.txt

シェルに関連するコマンドや手続きについて

ざっと、リストにしておこう.

コマンド等 機能等解説
chsh, ypchsh ログインシェルの変更.
標準シェルの中の好きなものにログインシェルを変更できる.
alias 別名=コマンド コマンドに別名を与える.
このコマンドを実行以降,指定したコマンドを別名で呼び出すことができる.
unalias 別名 別名を解除する.
history これまでに実行したコマンドの履歴リストの表示(の一部).
!! 直前のコマンド行の再実行.
時に便利だ.
!n (nは数字) コマンド履歴リストの n番のコマンド行.
これもなかなか便利.
!-n (nは数字) 現在より n行前のコマンド行.
同じく便利.
!文字列 コマンド履歴リスト中,指定文字列が先頭にあるコマンド行で最も最近のもの.
とても便利だ. 是非とも使いこなそう.
!?文字列? コマンド履歴リスト中,指定文字列が含まれるコマンド行で最も最近のもの.
便利なのだが,(人間が) 勘違いして違う行を呼び出してしまうことがあるので,
使うときは注意をするべし.
,, ^n, ^p など コマンド履歴リストを直接コマンドラインに表示して利用.
無意識に使っている人も多い.

  上に出てきたシェルの機能,コマンド等を一つ一つ確かめてみよ. 良く分からない概念などがたぶんあるだろうから,そうした際は教官や TA に遠慮無く聞くこと.

レポート

以下の課題について,あたうかぎり賢明な調査と考察を行い,
AppliedMath7-Report-01
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに $\TeX$ で作成した書面にて提出してもよい.

  1. man -a の意味を調べよ.
  2. cal を用いて,10年後の自分の誕生日が何曜日か調べよ.
  3. ls のオプションを調べ,自分で最もよい設定を探し,どう良いのか等を記述せよ. また,alias を用いて ls と打つだけでそのオプションが働くようにしてみよ.
  4. コマンドライン編集に使えるキーを調べよ. (左へ行くキー,右へ行くキー,一文字削除キー,行の後ろまで削除するキー,行の先頭に行くキー,行の最後に行くキー等々…)
  5. 上に記した「以外の」便利なシェルの機能がないか,調べて報告せよ.
  6. bash, tcsh, zsh の違いを書籍ないしは web 等の資料をもとに調べよ.さらに,各々のシェルを実際に使ってみて,その違いを体験して,自分なりの感想を記せ.