02. コマンドでの操作の基本

Photo by Michile Henderson on Unsplash

端末エミュレータ(コマンドを操作するためのソフトウェア)を起動

基本的には,仮想環境上で Ubuntu を使うという想定で授業資料を用意する. 他の環境でも問題ないので(MSYS, cygwin ではできないことがやや多いかな),適宜,読み替えて資料を読み込もう.

さて,まずは Unix (Ubuntu など)を起動しよう. そして, ここで,Ubuntu の場合, 下図のように左下の「アプリケーション(3つのドットが輪でつながったアイコン)」→「端末/Terminal」(日本語化してあると”端末”,そうでないと "terminal" という名前)とたどってクリックすると

to-launch-terminal

下の画面のように,「コマンド」を打ち込んだり,応答を得たりすることのできるソフトウェア "Terminal" (この和訳が「端末」)が起動する. あとでこれを使うので,そのままにして,先に進もう.

aa

また,これから授業が進むにあたり,まあしばらくはこの「端末」ソフトの上で作業を行うのでそう思っておこう. 最初は,とにかくキーボードから入力をして,応答を眺める,という感じになるだろう.

ちなみに,他の OS や環境でも,「端末エミュレータ」とか「terminal」というような名前で似たようなアイコンがあるだろうから探して起動しよう.

端末エミュレータって何?

端末エミュレータは,文字端末と呼ばれる文字しか扱わない端末の「エミュレータ=動作模倣ソフトウェア」の一種だ. CUI環境を体感するには端末エミュレータは最も手軽な手段であるので,これからも良く用いるよ. 文字端末エミュレータには,xterm, rvxt などほんとうに多くの種類があるので,自分の好みのものを探すと幸せになれる.

コマンド操作の基本

さて,すこしばかりお勉強の時間だ.

Unix の CUI上で操作を行うということはどういうことか解説しておこう.

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

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

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

命令形の動詞 副詞 目的語

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

コマンド オプション 引数

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

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

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

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

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

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

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

  実習のお時間だ.操作しても支障のなさそうな範囲で, 初心者ガイドなどに出てきたコマンドを試してみて,コマンド操作の雰囲気をつかんでみよう. 具体的には,次の手順で行うと良い. なお,この手順はこの授業での実習の基本なので,「端末」ソフト(端末エミュレータなどと呼ぶ)の扱いには慣れておくべし.

  1. 「端末」ソフト(端末エミュレータ)を起動する(もうやってるはずだね).

  2. その上で,初心者ガイドに出てきた無難そうなコマンド(ls とか pwd とか,w とか)をタイプし,[Enter] キーを押して入力.

  3. 現れた反応をみて学習.

  4. 以下繰り返し.

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

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

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

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

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

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

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

下記に,オンラインマニュアルの詳細を示しておくが,まあ基本は,

man 知りたいコマンド

と入力することだ.それ以上はおいおいでいいだろう.

コマンド等 機能等解説
man コマンド名 オンラインマニュアル.
与えたコマンドについてのマニュアルを表示する.
何も設定しないと,たいていは英語マニュアルだ.
jman コマンド名 与えたコマンドについてのマニュアルを日本語で表示する.
もちろん,設定しておかないと使えない.使いたい人は "ubuntu man 日本語化" なんてキーワードで検索すると良いんじゃないかな.
man man オンラインマニュアルのマニュアル(^-^).
man もコマンドなので,これはアリなのだ.
マニュアルの使い方についてよく分からない場合はこれを見よ.
man -k キーワード マニュアルデータベースの中からキーワードを含むコマンドを列挙する.
良く分からないがこんな感じ,というコマンドを探したりするのに使う.
xman GUI でのオンラインマニュアル.
存在するマニュアルリストが一覧で見られるなど,結構便利.
英語表示のみなことが多い.
info 主にアプリケーション向けのオンラインマニュアル. 一種のハイパーテキスト.
操作方法が一種独特. 起動したら ? を押すと操作方法のページに飛ぶ.d で戻れる.q で info を終了だ.H を押すとチュートリアルに入れるので最初にそうすると良いかも.

  以下のようなコマンドを入力して応答を見ることで,オンラインマニュアルコマンドを試してみよう. 行番号は気にしなくて良い.

1man ls
2man pwd
3man rm
4man w
5man man
6man mkdir

他にも,初心者ガイドなどに出てきたコマンドを対象としてマニュアルを調べてみるとよいだろう.

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

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

まあ,困ったらとりあえず,キーボードの q キーを押そう.だいたいもとに戻るはずだ.

他に何ができるか,具体的には,man less などとして調べてみよう.


シェル

さて次に知っておくといいのは,シェルと呼ばれる特別なソフトウェアについての情報だ. この特別なソフトウェアであるシェルと人間,そして OS の関係はおおよそ次のような図で表せる.

aa

要は,Unix で CUI 操作をしようとすると実はそこには「シェル」というソフトウェアが既に起動していて,人間の命令 (コマンド) を待ち構えていて,命令をするとそのとおりにいろいろやってくれるのだ.

具体的には,「端末」ソフトを起動したとき,

>



$

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

基本的に,この「シェル」プログラムを通して人間の文字入力を命令としてコンピュータに伝えるのがUnix での CUI 操作である. つまり,Unix os と人間の間に,シェルが入って両方の橋渡しをしてくれるのである. イメージとしては,

シェルは「同時通訳者」もしくは人間の「執事,召使い」

と思えばよい. 実際,シェルは細かいことを人間の代わりに覚えておいてくれたり,探し物をしてくれたり,間違ったコマンドを直してくれたり,とまさによくできた召使いといってよい.

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

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

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

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

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

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

今自分が使っているシェルは?

本当は環境依存なコマンドだが,まあだいたいの環境では下記のコマンドで調べられるだろう.

1env | grep -i "shell="

普通の Linux 環境で特に設定を変えてないという人はおそらく /bin/bash という答えが返ってくるだろう.

シェルの種類

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

系統 性質
sh系 sh という最もシンプルかつ古いシェルに端を発する.
シンプル.
機械的処理に向く.
対話的処理が分かりにくい.
ちなみに,今の多くの Unix で sh と称されているものの実体は bash だったりするので、本当の元祖 sh の素朴な機能を実感することは難しい.
csh系 C 言語にやや似た文法.
対話的に使いやすい.
シェルスクリプトでやや問題が生じやすい.

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

強力なシェル fish

おすすめのシェルとして fish というものがある.Unix を使っていて「ここがこうだったら良いのにな」という細々した希望の一部が実現されていて,なかなか便利で強力だ. 気になる人は fish に関する解説動画の一つ(on Youtube) などを見てみるとよいだろう.

自分の PC の Unix にならば fish をインストールすることも可能なので,ちょっと調べて試してみると良い. また,Cygwin にもインストールできる.

Ubuntu にfish をインストールするならば

1sudo apt install -y fish

とするとインストールできる.そして

1fish

とすれば(すぐ後述するように)一時的に fish が使える.
そしてそうだなあ,例えば小文字の m を入力してから TABキー を押してみよう. m から始まるコマンド等の候補を示してくれるぞ.
fish はこうした「補完」が強力なので,入力が一部だけで済むようになる.いろいろ試してみよう.

さて,いつも fish を使いたいというのであれば,(これもログインシェルの変更として後述しているが)

1chsh

とすると,どのシェルにしたいのかという入力を要求される.そこで /usr/bin/fish と入力すれば良い. パスワードも聞かれるかな.

こうすると,次の OSログイン時から fish が使えるようになるぞ.

蛇足までにもう少し情報を書いておくと,Oh My FishFisher という,fish の設定やプラグインの管理ソフトも存在する. これらを用いると fish のいろいろな設定を一気に変えられたり(テーマ機能)する. 気になる人は調べておこう.

シェルの一時変更

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

たとえば,

1sh

と入力して大変素朴な sh シェルを起動してみよう(その正体は素朴に振る舞う dash だったりするが). その後, lspwd など,様々なコマンドを入力してみて,少し気配が違うことをがわかるだろうか(まあ,今はわからなくても良い). そしてその後,

1exit

と入力して(最初のシェルに)戻ってこよう.

ログインシェルの変更

ログインすると自動的にあるシェルがユーザ用に起動し,それ以降ユーザと Unix システムの橋渡しをする. この,ログインすると自動起動するシェルをログインシェルと呼ぶ. ログインシェルはシステムの標準シェルの中から自分の好みのものを選択して変更することができる.

ただし,標準シェルとは /etc/shells に登録されているものをいう. 現状でどんなものが登録されているか,試してみよう.

1less /etc/shells

と入力してみれば良い.

aa

という感じの結果が出てくるはずだ. とりあえず,この環境では(許可されていれば)実質的に

/bin/sh, /bin/bash, /bin/dash, /usr/bin/fish

の4種類ほどからシェルを選択できそうだ,ということがわかる.

ログインシェルの変更方法については後述の表の中の chsh というコマンドを使う.これは起動すると,切り替えたいシェルを(path付きで)記入するよう求められるのでそう入力するだけで良い. ただし,公共の環境だと変えられなかったりする.

シェルの機能

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

コマンドの入力

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

連続実行,grouping

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

コマンド; コマンド; …

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

(コマンド; コマンド)

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

ヒストリー

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

コマンドラインの編集

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

補完

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

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

別名(alias)

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

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

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

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

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

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

ワイルドカード展開の例

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

 1> ls -Fa
 2
 3./ .a 00.c a.txt b z.txt
 4../ .b a abc dummy.html
 5
 6> echo ???
 7
 8abc
 9
10> echo [a-c]*
11
12a a.txt abc b
13
14> echo {a,z}.txt
15
16a.txt z.txt
17
18> echo *.*     ← 途中にピリオドのあるもの. ファイル名先頭の . には対応しない.
19
2000.c a.txt dummy.html z.txt
21
22> echo *      ← 全て… と言いたいがファイル名先頭の . には対応しない.
23
2400.c a a.txt abc b dummy.html z.txt
25
26> echo .* *   ← 全て… と言いたいがディレクトリの . .. にも反応してしまう.
27
28. .. .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 に遠慮無く聞こう!

レポート No.2

以下の課題について,なるべく一生懸命な調査と考察を行って,
     学籍番号-氏名-02.pdf
というファイルとしてレポートを作成し、 webフォーム から教官宛に提出しよう.

なお,レポートを $\TeX$ 等で作成したものを印刷した「紙媒体」を教官に直接手渡す形で提出してもよいが、物質によるレポート提出は常に破損や紛失の可能性があるのであまりお勧めはしないぞ.

  注意
  近年はセキュリティ上の懸念から,実行形式のプログラムなどをメールに添付するとそのメールそのものの受信を受信側サーバが拒絶したりする. そういうことを避けるため,レポートをファイルで提出するときはそういった懸念のあるファイル形式のものではないようにしよう.

まあ要するに,レポートは pdf ファイルにして送るのが良い ということだと思っておこう.

  1. man -a の意味を調べよ.

  2. cal を用いて,10年後の自分の誕生日が何曜日か調べよ.
    注: そんなコマンドはない,と言われた場合,次のようにしてインストールしておこう(Ubuntu の場合).
1sudo apt install ncal

としてインストールしておこう.地味に便利なコマンドなので.

  1. ls のオプションを調べ,自分で最もよい設定を探し,どう良いのか等を記述せよ. また,alias を用いて ls と打つだけでそのオプションが働くようにしてみよ.

  2. コマンドライン編集に使えるキーを調べよ. (左へ行くキー,右へ行くキー,一文字削除キー,行の後ろまで削除するキー,行の先頭に行くキー,行の最後に行くキー等々…)

  3. 上に記した「以外の」便利なシェルの機能がないか,調べて報告せよ.

  4. bash, tcsh, zsh の違いを書籍ないしは web 等の資料をもとに調べよ.さらに,各々のシェルを実際に使ってみて,その違いを体験して,自分なりの感想を記せ(zsh は環境によっては体験できないので,その場合は zsh を使ってみて,というのはしなくてよい).

  5. 可能な人は,fish シェルをインストールし,自分のログインシェルとして指定してみよう(これからしばらくはそれを使ってみる,ということだ).