UNIXコマンドの基礎

UNIX(ユニックス)はオペレーティングシステム(OS)※の一種である。1969年に開発された古いOSであるが様々な派生版が作成され、またFreeBSDやLinuxなどのフリーでオープンソースなものも現れたこともあって、現在でもサーバやワークステーションといった大型のコンピュータからスマートフォンなどの携帯機器に至るまで広く使用されている。MacのOSであるmacOSもUNIXの派生版である。

※コンピュータのハードウェアの制御、メモリ管理、ファイル管理、通信機能、複数のタスクのスケジューリング、といった、様々なソフトウェアで共通に使用する機能を提供したり、ソフトウェアの実行を制御するための基本ソフトウェアのこと。

UNIXで人間がコンピュータに指示を出すためには、コマンドと呼ばれる単語をキーボードで入力する。また、コマンドに対するコンピュータの返答も文字だけである。UNIXが開発された当時はコンピュータグラフィクスはまだ一般的ではなかったのである。現在のグラフィクスを使ったユーザインタフェースのことはGUI (Graphical User Interface) と呼ばれるが、それと対比して、コマンドによるユーザインタフェースはCUI (Character User Interface または Command User Interface など) と呼ばれたりすることもある。

GUI全盛の現代において一般ユーザがCUIを使うことはほとんど無くなったが、技術者としては最低限の操作方法は知っている必要があるだろう。OSの深部を操作する、ネットワーク越しに別のコンピュータを遠隔操作する、といった場合にはコマンドが不可欠になる。また、同じような手順の繰り返しといったGUIでは面倒な操作もコマンドであれば一発で解決できることもある。あるいはシェルスクリプトという一種のプログラムを使って複雑な操作を自動化することも可能である。

コマンドのためのキータイプの基本

まず、コマンドを入力するためのキーボード操作についておさらいしておこう。

ターミナル

macOSでの操作の基本はGUIである(Macは1984年発売時からGUIでの操作が特徴だったのだ)。なので、コマンドで操作するためには「ターミナル」アプリを使う。「ターミナル」アプリは「アプリケーション」フォルダの中の「ユーティリティ」フォルダの中にある※。

※Launchpadから起動する場合は「その他」の中にある。


今後よく使うことになるのですぐに起動できるように、必ずDockに登録しておこう。

ターミナルterminalとは「端末」という意味である。昔のコンピュータは現在のように一人一台使えるような安価なものではなく、大型のコンピュータを複数のユーザが共用するのが基本であった。端末は、ユーザが使うための窓口に相当する機械である。写真は標準的な端末であるVT100である。「ターミナル」アプリは、このVT100をソフトウェアで再現したものである。

「ターミナル」を起動すると次のようなウィンドウが表示される(表示される文字は使用環境に応じて異なる)。

1行目の"Last login:..."は、前回最後に使用した時刻と使用環境を表示している。誰かが勝手に使っていないか確認する、などの意味があるが、パソコンを共有せず一人で使っている分にはあまり気にしなくてよいだろう。

2行目は使用環境によって異なる(この部分の読み方が気になる人は下の赤枠を読んで欲しい)。最後に灰色の■が表示されている。設定によっては|(縦棒)になっていたり、点滅しているかもしれない。この■はカーソルcursorと呼ばれ、文字の入力位置を表している(ワープロと同じである)。つまり、2行目はターミナルがユーザからの入力を待っている状態を表しており、コマンドプロンプト prompt(あるいは単にプロンプト)と呼ばれる。

プロンプトの表示の意味:@まではユーザ名、@の後ろはMacに設定されたコンピュータの名前。スペースを空けて、現在作業中のディレクトリ。最後の%はプロンプトの最後であることを表している。上のスクリーンショットの例では、giantという名前のコンピュータのmminaというユーザが~(ホームディレクトリ)で作業中という意味。~についてはファイルシステムの回で説明する。なお、この表示パタンは初期設定であり、どのような情報をどのように表示するかは設定ファイルできめ細かく設定することが可能になっている。
なお、古いMacではbshがデフォルト設定だったため、次のとおりとなる: スペースまで(~まで)の左側は、コンピュータの名前と現在作業中のディレクトリを表示している。ディレクトリについては後述する。スペース以降の右側は現在使用しているユーザ名と、プロンプトの最後であることを表す%が表示されている。

なお、標準状態では文字が小さくて読みにくいかもしれないので、「環境設定」メニューでフォントの大きさを変えるなどして見かけを好みに調整するとよいだろう。文字が小さいと間違いに気付きにくいのである程度大きくすることを強く推奨する。

ただし、フォントの種類は慣れるまで変更しない方がよい。初期設定のフォントは、0とO、1とlとIといった似た文字が区別しやすくなるような字体となっている。

ターミナル用のフォントでは0(ゼロ)はO(オー)と区別しやすいように斜線や点が輪の中に描かれている。

コマンド操作の基本

コマンド command は、コンピュータが提供する機能を呼び出すための呪文だと思えばよいだろう。実際は、それぞれの機能に応じてソフトウェアが用意されていて、そのソフトウェアを指定して実行するための操作がコマンドである。GUIではアイコンをダブルクリックしてソフトウエアを起動するが、CUIではソフトウェアの名前を直接入力するのである。

コマンドによる操作は次のような流れになる:

  1. コンピュータがコマンド入力を待つ(プロンプトを表示している)。
  2. ユーザがコマンドをタイプし、最後に入力完了を意味するReturnキーをタイプする。
  3. コンピュータは入力されたコマンドを実行する。コマンドによっては実行結果をターミナルに表示する。
  4. 1.に戻る。

ごく簡単なコマンド

まず手始めに、ごく簡単なコマンドを試してみよう。なお、本資料ではプロンプトは単に%のみを示すことにする。プロンプトの右側の単語がコマンドである。コマンド入力の最後にReturnをタイプするのを忘れずに。

% date
2021年 2月16日 火曜日 11時53分15秒 JST
% ▌

dateコマンドは現在の時刻を表示するコマンドである(JSTは日本標準時の意味)。

コマンドは間違いを許さない。コマンド名を間違えると次のようなエラーメッセージが出る。

% data
zsh: command not found: data
% dete
zsh: command not found: dete
% ▌

"command not found"は「コマンドが見つかりません」という意味。これくらいの英語は臆せず読むようにしよう(なお、英文法としては完全な文になっていないが、日常的な英語は結構いい加減な感じで使われている)。最後の date とか dete は見つからなかったコマンドを表示している。人間が"date"という単語を"deta"とか"dete"と間違ったとしても、コンピュータにとって間違ったとは分からずに、単にそのようなコマンドは存在しない、というエラーを返す。もし仮に間違った単語に相当するコマンドが存在していたとすると、コンピュータはそのままそのコマンドを実行してしまう。

もう一つ別のコマンドを実行してみよう。

% cal
      2月 2021         
日 月 火 水 木 金 土  
    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  

% ▌

calコマンドは今月のカレンダーを表示するコマンドである(calendarのcal)。上の実行例は閲覧環境によってはフォントの違いのためずれて見えるかもしれないが、ターミナルではちゃんと揃って表示されると思う。

引数とオプション

calコマンドは単独で実行すると今月のカレンダーを表示するが、月と年を与えて指定した月のカレンダーを表示させることもできる。

% cal 3 2011
      3月 2011
日 月 火 水 木 金 土
       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 31
% ▌

このように、コマンド名に続けて、コマンドの動作に必要な情報を与えることがある。これを引数(ひきすう)と呼ぶ。上の例では"3"や"2011"が引数である。コマンドと引数、引数と引数の間にはスペースを入れる。どのようなコマンドがどのような引数を受け取ることができるか、引数の順番や意味などはコマンドによって決まっている。calの引数は英語的に月→年の順序で指定することになっている。

練習 自分の生まれた年月のカレンダーを表示してみよう。

次に、calコマンドに"-y"を付けてみよう。

% cal -y
                            2021
         1月                    2月                    3月           
日 月 火 水 木 金 土  日 月 火 水 木 金 土  日 月 火 水 木 金 土  
                1  2      1  2  3  4  5  6      1  2  3  4  5  6  
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   7  8  9 10 11 12 13  
10 11 12 13 14 15 16  14 15 16 17 18 19 20  14 15 16 17 18 19 20  
17 18 19 20 21 22 23  21 22 23 24 25 26 27  21 22 23 24 25 26 27  
24 25 26 27 28 29 30  28                    28 29 30 31           
31                                                                

         4月                    5月                    6月           
日 月 火 水 木 金 土  日 月 火 水 木 金 土  日 月 火 水 木 金 土  
             1  2  3                     1         1  2  3  4  5  
 4  5  6  7  8  9 10   2  3  4  5  6  7  8   6  7  8  9 10 11 12  
11 12 13 14 15 16 17   9 10 11 12 13 14 15  13 14 15 16 17 18 19  
18 19 20 21 22 23 24  16 17 18 19 20 21 22  20 21 22 23 24 25 26  
25 26 27 28 29 30     23 24 25 26 27 28 29  27 28 29 30           
                      30 31                                       

         7月                    8月                    9月           
日 月 火 水 木 金 土  日 月 火 水 木 金 土  日 月 火 水 木 金 土  
             1  2  3   1  2  3  4  5  6  7            1  2  3  4  
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   5  6  7  8  9 10 11  
11 12 13 14 15 16 17  15 16 17 18 19 20 21  12 13 14 15 16 17 18  
18 19 20 21 22 23 24  22 23 24 25 26 27 28  19 20 21 22 23 24 25  
25 26 27 28 29 30 31  29 30 31              26 27 28 29 30        
                                                                  

        10月                   11月                   12月           
日 月 火 水 木 金 土  日 月 火 水 木 金 土  日 月 火 水 木 金 土  
                1  2      1  2  3  4  5  6            1  2  3  4  
 3  4  5  6  7  8  9   7  8  9 10 11 12 13   5  6  7  8  9 10 11  
10 11 12 13 14 15 16  14 15 16 17 18 19 20  12 13 14 15 16 17 18  
17 18 19 20 21 22 23  21 22 23 24 25 26 27  19 20 21 22 23 24 25  
24 25 26 27 28 29 30  28 29 30              26 27 28 29 30 31     
31
% ▌

すると今月だけでなく、1年分のカレンダーが表示される(上の例はフォントの違いでずれて表示されているかもしれない)。yはyearのyである。

このように、コマンドの挙動を変化させる指示をオプションと呼ぶ。多くのコマンドのオプションは"-y"のような-とアルファベット一文字の組み合わせであるが、中には単語になっていたり、-が無いオプションがあったり、オプションの次に引数をとったり、と様々である。いずれにしてもコマンドによって異なるので、詳しいところはコマンドの使い方を調べなければならない(後述)。

対話型コマンド

もう一つの実行形態のコマンドの例も見ておこう。bcは電卓コマンドである(本当はプログラムによる高度な計算もできる)。

% bc
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
▌

bcコマンドを入力すると、このようにメッセージを表示して止まってしまったように見える。これは計算式の入力を待っている状態である。試しに何か計算式を入力すると、計算結果を表示する(×の代わりに*を使う)。

% bc
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+2*3-4
3
▌

練習 いろいろな計算式を与えてみよう。

÷の代わりに/を使う。割り算は整数で計算して小数点以下を切り捨てるので、答が変に感じることがあるかもしれない。例えば1+2*3/4を計算してみよう。

bcコマンドを終了させるには"quit"と入力する。

% bc
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
1+2*3-4
3
quit
% ▌

このような、実行中にユーザからの入力を待って対応するコマンドを対話型コマンドなどと呼んだりする。

コマンドの使い方を調べる

コマンドがどのような機能を持つのか、どのような引数を与える必要があるのか、どのようなオプションが用意されているか、といったように、使い方を調べる必要がある。使い方すべてを覚える必要はない。どのようにして調べればよいか、を覚えればよい。

ちなみに、大学での学びは授業で教えられることだけをやっていれば良いのではない。教えられた内容も重要であるが、それ以上に、調べ方を覚える、自ら知らない知識を調べて得る、得た知識を自分の頭で咀嚼(そしゃく)して理解する、といったことが重要で不可欠となる。

調べ方としては、とりあえず次の3つくらいがあるだろう:

コマンド自体をどうやって調べるか

コマンド名を知っていれば使い方は前節のようにして調べることができる。が、そもそもどんなコマンドがあるのかをどうやって調べればよいのだろうか?

これについてはよい方法は無い。UNIXには大量のコマンドが標準で用意されている。さらに、非標準のコマンドを追加することもできるし、自作のプログラムですらコマンドとして使うこともできる。よって、すべてのコマンドを覚えるのは諦めた方が良い(コマンドを極めたいなら話は別だが)。「UNIXコマンド集」のような書籍やWebページもあるので、こういった情報源を駆使してやりたいことができるコマンドを探していくとよい。入門本を読んで試してみるのもよい。経験を積んだ人に教えてもらうのもよいだろう。

よく使うコマンドは覚えていこう。逆に言うと、使わないと覚えられないのは当然なので、積極的に使っていこう。何がよく使うコマンドか、はどのような作業を行うかに依存するが、大量のコマンドのうちのほとんどは滅多に使われないものである。例えば上記のcalは、もっと良いカレンダーアプリが存在する現在ではほとんど使われることがないだろう。dateコマンドは時刻を見るだけならあまり使わないかもしれないが、他のコマンドと組み合わせて時刻を記録するような用途に使われたりする。一般的によく使うものとしては、ファイル操作関連のコマンドが挙げられる。コンピュータ上での作業の大半はファイル操作であるという分析もあるようである。また、ネットワーク越しに別のコンピュータを使うためのコマンドなども覚えておくべきだろう。これらについては本演習で扱っていく。

コマンドで困ったときは

コマンド操作をしていると、誤った操作をしたりコマンドの使い方を間違ったりして、ターミナルの表示が変わらない、表示が崩れてしまう、プロンプトが表示されず入力できない、といったおかしな状態になってしまうことがある。そのような場合は次の方法を試すとよい。

以上の対応法は標準のコマンドに限らず、ターミナル上で実行する自作のプログラムでも同様である。今後プログラミングをやっていくと頻繁に使うことになるだろう。少なくともCtrl+cは覚えておくこと。

練習
catコマンドを実行してCtrl-cで中断させよう。catコマンドの機能と正しい使い方を調べてみよう。bcコマンドもCtrl-cで中断させてみよう。英語だからといって表示されたメッセージから目を背けないように!!

シェル

以上のように、コマンド操作はターミナルアプリ上でユーザが入力を行い、コンピュータがコマンドを実行して結果を表示する、ということの繰り返しとなる。ユーザとコンピュータが対話しているかのように進行するので、このような操作形式は「対話型操作 interactive operation」と呼ばれる。

ところで、コマンドはUNIX OSの一部として提供されている。このOSの中核部分はカーネルkernelと呼ばれるが、カーネル自体は対話機能、すなわちユーザからの入力を待ってコマンドを実行し結果を返す機能は持っていない。コマンド操作はターミナルアプリ上で行っているが、実際にはターミナルアプリはVT100という端末機械をソフトウェアで再現しているだけの機能しかない。対話型操作を実現するために別途、ユーザとカーネルの橋渡しをしてくれるプログラムが存在している。

このような特別なプログラムをシェル shell と呼ぶ。シェルの機能としてはコマンドを実行する以外にも、コマンド入力を補助する、コマンドが実行する際に参照する設定値(環境変数と呼ばれる)を管理する、シェルスクリプトと呼ばれるコマンドの自動実行スクリプト(プログラムの一種)を解釈して実行する、といった様々な機能を有している。

シェルには有名なものだけでも sh, bsh, csh, tcsh, ksh, zsh など様々あるが、最新のmacOS(Catalina以降)ではzshが標準で使用されている(Mojave以前はbash)※。シェルの機能は豊富ですべてをマスターするのは大変である。本演習ではコマンド入力の補助機能を紹介する程度にとどめておく。

※macOSにはバージョン毎に地名の名称が付いている。Macを使うならば覚えておこう。

ヒストリ機能

シェルは過去に入力・実行したコマンドの履歴を記録しており、呼び出して再利用することができる。この機能をヒストリ history 機能と呼ぶ。

記録されているコマンド履歴を表示するにはhistoryコマンドを使う。

練習 historyコマンドを実行して履歴を確認しよう。

左側は何個目の履歴かを表す番号である。数字以降は入力されたコマンドの内容である。履歴が沢山表示されて見にくい場合はオプションに数字を与えれば、遡って表示する個数を指定できる。

履歴を呼び出してコマンドを再実行する場合、次の2つの方法がある:

コマンドラインの編集

入力中のコマンドラインはカーソルを移動させて編集(修正)することもできる。一旦入力したものの間違いに気づいたり、履歴で呼び出したコマンドを一部を変更して実行したい場合などに役に立つ。

カーソル移動の基本は左右であるが、他にも幾つか便利な編集操作キーが設定されている。

キー 機能
Ctrl+b または ← 一文字左に移動(backward)
Ctrl+f または → 一文字右に移動(forward)
ESC b 1単語左に移動
ESC f 1単語右に移動
Ctrl+a 行頭に移動(ahead)
Ctrl+e 行末に移動(end)
Delete または Ctrl+h カーソルの左側の文字を一文字削除
Ctrl+d カーソル上の文字を一文字削除
Ctrl+k カーソルから行末まで全部を削除

これらのキー設定(キーバインド)も多くのテキストエディタと共通になっている。

練習 まず、calコマンドで自分の生まれた年月のカレンダーを表示させよう。次に、ヒストリ機能でこのコマンドを呼び出し、編集して前月および翌月のカレンダーを表示させよう。

ファイル名補完機能

コマンドの引数にファイル名やディレクトリ名(詳しくは後述)を指定することがあるが、途中まで入力してTabキーをタイプすると、入力した部分に一致する名前を探して、残りの部分を自動的に入力(補完)してくれる。コマンド自体もファイルなので同じように補完機能が働くが、コマンドは似たような短い名前のものが多いので、コマンドに対してはあまり有効でないかもしれない。例えば his まで入力してTabキーを押してみよう。