コマンド

先にMacがファイルをどのような形で管理し、ユーザに提示しているか説明し、システムの内部構造を意識することを説明しました。

ここではコマンドを用いた操作を通してコンピュータの内部構造の理解を進めます。

先に扱う事項を簡単にまとめておきます。

この流れを頭に入れて進むと良いです。

ターミナルとコマンド

ターミナルの起動

ターミナル(ターミナル・アプリケーション)を起動してください。

image-20231228185123952

ターミナルはアプリケーションフォルダの中の「ユーティリティフォルダ」の中にあります。

image-20231228184904546

起動すると、下のようなウィンドウが現れるでしょう。

image-20231228190422447

コマンドの実行

コマンドプロンプト

下図の拡大部分に注目してください。% 記号が出ていますが、これをコマンドプロンプト、と言います。

image-20231228190520229

(この % がついている行全体をコマンドプロンプトと呼ぶかもしれません。)

date コマンド

コマンドプロンプトに続いて、「 date 」とタイプ入力して Enter キーを押してください。以下のような表示になるでしょう。

image-20231228191155208

これは日時を出力する「 date 」コマンドを実行し、その結果がターミナルの画面に表示されたことを示しています。

コマンド(command)とは「命令する」ことですが、つまり今あなたはコンピュータに「 date プログラムを実行せよ」という命令を(文字列で)出したのです。この状況を「date コマンドを実行した」などと表現します。

dateコマンド(date プログラム)は一行、画面に日時を出力して、すぐその実行を終了します。コマンドの実行が終了したので、上の画像では、画面に再びコマンドプロンプトが表示されています。「次のコマンドをどうぞ」ということですね。

プロンプト
prompt とは「促すもの」あたりの意味を持ちます。講演者の前に次のセリフを表示するものをプロンプターなどと言いますね。command もそうですが、英語でその語を当てて用語を決めた人の意図を意識すると良いです。

top コマンド

次に top コマンドを試してみましょう。以下のような表示になるでしょう。

image-20231228193538126

top コマンドは現在実行されているプログラム(プロセス・後述)の一覧を出力するものです。赤矢印のところを見るとわかるように、top コマンドは(デフォルトでは)「CPU利用率の高い」順にプロセスを表示し、一秒おきに最新状態に書き換えます。何かアプリケーションを操作して仕事をさせれば、それがリストの上の方に現れることが確認できるでしょう。他にもプロセスごとの実行時間の長さ、メモリ使用量、またシステム全体でのメモリの使用量やネットワークに出しているパケットの量などが表示されています。

top コマンドは date コマンドと違って「すぐ実行終了する」ようには作られていません。終了するには、ターミナルの画面が一番上に表示されている(アクティブな)状態で、「 q (英字のQ) 」を押します。

q を押しても終わらない?

もし「何度 q キーを押しても終了しないぞ?」と思ったら、日本語入力モード(カナ漢字変換)になっていないか確認してください。画面をよく見てください。日本語入力モードの時に Q を押し続けると QQQQ を「っっっっ」みたいに変換している表示が見えたりします。その場合は英字入力モード(カナ漢字変換を停止)にして、もう一度「 q 」キーを押してください。

image-20231228194454021

コマンドプロンプト再び

「 q 」キー入力によって top コマンドが終了すると、以下のようにまたコマンドプロンプトが表示されています。date の時とは違って、一行も出力を残さず、top コマンドを投入したすぐ次の行にプロンプトが出ています。

image-20231228194737489

コマンドを実行する仕組み

シェル

コマンドの実行はターミナルではなく「シェル」と呼ばれるプログラムが実現しています。シェルの仕事を以下にまとめます。

  1. コマンドプロンプトを表示する
  2. 入力された文字列に相当するプログラムを起動する(「 date 」であれば date プログラムを起動する)
  3. 上の 2. で起動したプログラムにキーボード入出力を任せてシェル自身は待ち状態に入る
  4. 上の 3. で起動したプログラムが終了すると、キーボード入出力をシェル自身に戻して 1. から繰り返す

つまりコマンドとは、この「シェルに与える名前(文字列)」のことです。「コマンドを実行する」と短く表現することが多いですが、内部的には「シェルにコマンド名を与えることで、それに対応するプログラムが起動・実行されている」ことだと認識してください。

受講生らの Mac ではシェルプログラムとして zsh という名前のものを使っています。

ターミナルとシェルとコマンド

この単元で行ってきたターミナルの起動から date, top コマンドの実行までの過程を整理してみます。下の図を見ながら箇条書きの説明を対照して読むと良いでしょう。

image-20240303152055900

  1. Finder の操作によってターミナルを起動する
  2. 自動的にシェル( zsh プログラム)が起動される
  3. シェルはコマンドを受け付けるため、たとえば date コマンドを与えると date プログラムを起動する
  4. date プログラムは日時を表示して自動的に終了する
  5. これでキーボードの入力を再びシェルが受け取れる状態になる
  6. シェルに top コマンドを与えると top プログラムを起動する
  7. top プログラムはキー操作を受け付けるようになるが、その後( q キーを押すことで)実行を終了する
  8. 再びキーボードの入力はシェルが受け取れるようになる
  9. ここで exit コマンドを与えるとシェルは終了する
  10. ターミナルは(自分が自動的に起動した)シェルが終了すると、自動的に自分自身を終了する
  11. これで制御は Finder に戻る(起動したという記録を消す程度でほとんど何もしないが)

ログインシェルの設定

ターミナルは自分が起動されると自動的にシェルを起動するようになっています。シェルはよく使われるものですら何種類かあり、ユーザの好みによって切り替える事が出来る場合が多いです。Macは標準的にzshを使うようになっていますが、少し前まではbashを使っていましたし、それ以外にもcsh, tcshなどがあります。

Macのターミナルでも自動的に起動するシェルを変更できます。ターミナルの「ファイル」メニューにある「設定…」項目を実行して以下のウィンドウを表示してください。

image-20240303150159093

ここの「開くシェル」がその設定箇所です。デフォルトでは上の状態、つまり「デフォルトのログインシェルを起動する」ことになっており、それが /bin/zsh であることが(うっすらと)示されています。

「開くシェル」のラジオボタンによる選択を「コマンド」に変更し、そこに /bin/bash など他のシェル・プログラム名を記入すると、次回のターミナル起動、あるいは「ファイル」メニューの「新規ウィンドウ」操作からは、指定したシェルが自動的に起動されます。

一般ユーザが使うものではありませんが、コマンドで現在のシェルがどれなのか調べる方法が幾つかあります。例として環境変数 SHELL を見る方法を示しておきます。

yasuda@Hex ~ % echo $SHELL
/bin/zsh
yasuda@Hex ~ % 

コンピュータにおけるプログラムの実行

「コマンド」とはアプリケーション・プログラムを起動する一つの方法です。ここでは「コマンドによるプログラム実行」を、コンピュータのシステム構造の中での振る舞いとして説明します。

アプリケーション・ソフトウェアやシステム・ソフトウェア、ノイマン型コンピュータなどの概念については「コンピュータ概論」の後半に扱うはずですので、ここでは簡単に通り過ぎるだけにします。

エンドユーザとしてではなく
これまでも Safari やテキストエディットなどのアプリケーションを、アイコンをダブルクリックなどして起動してきました。エンドユーザ向けの機能を使うだけならそれで良いのですが、情報系学部の学生としてはシステムの構造を理解して、開発ツールを使う必要が生じます。コマンドはその最初の一歩です。

アプリケーションの実行とメモリの内容

ここでは、一般的な(ノイマン型の)コンピュータをメモリに注目して以下のように表現します。

image-20240101184437139

記憶装置が二種類の技術で実現されていることを意識してください。以下に性質の違いを書いておきます。

製品・実現技術 アクセス速度 揮発性
メモリー DRAM (電気) 高速 電源を切ると内容が消える
ストレージ ハードディスクやSSD (磁気) 低速 電源を切っても内容は消えない

この実現技術由来の制限(揮発性)のため、一般的なコンピュータは電源を入れる前はメモリーは空の状態(上図)になります。

以下に(MS Wordを例に)アプリケーションソフトウェアを実行する際の振る舞いについて図示します。

image-20240102103949113

  1. 初期状態(アプリケーション起動前)ではアプリケーション・ソフトウェアはストレージの中に置かれているだけ
  2. アプリケーションを起動する操作によって、アプリケーションがメモリの中に読み込まれる
  3. CPUがメモリ中のプログラムを実行する
  4. アプリケーションを終了すると、メモリから消えて初期状態に戻る

CPUはメモリーにあるプログラムしか実行しません(ストレージは低速すぎて、プログラム実行にはとても使えません)。上のようにいったんメモリにコピーして実行します。

プロセス
この、メモリにあって実行中のプログラムのことを「プロセス」と呼びます。上の top コマンドで表示されていたのはプロセスの一覧だったわけです。

コマンドによるプログラムの実行

先ほど date や top を例に、コマンドによるプログラム実行を試しましたが、これらもアプリケーション・ソフトウェアであり、結局プログラムをCPUに実行させている点では同じです。以下に date コマンドを例にアプリケーションソフトウェアを実行する際の振る舞いについて図示します。

image-20240102110747048

  1. 初期状態(コマンド実行前)では date, top といったコマンド群はストレージの中に置かれているだけ
  2. date コマンド(date プログラムの起動操作)によって、date プログラムがメモリの中に読み込まれる
  3. CPUがメモリ中の date プログラムを実行する
  4. date プログラムは自動的に実行を終了し、メモリから消えてコマンド実行前の状態に戻る

このように、ストレージ中にあるプログラム・ファイルについて、その「名前」を指定して実行する方法を「コマンド」と呼んでいます。名前とは実際には「ファイル名」のことです。つまりどこかに「 date 」という名前のファイルがあるのです。(興味のある人は補足2. を参照)

MS Word も date も同じアプリケーション・ソフトウェア

つまり MS Word と date は、その起動のための操作が異なるだけで、どちらも実行可能なプログラムである(アプリケーション・ソフトウェアである)という意味では同じものです。コンピュータのストレージの中に置かれたプログラムを、メモリ中に読み込んで CPU に実行させているのです。

参考

補足1. GUI と CUI によるプログラムの起動

Word の起動は GUI (Graphical User Interface) による方法、date の起動は CUI (Character User Interface) による方法を用いています。

ここでは、これまでにやってきたアプリケーション(やコマンド)の実行について整理します。

まず Mac の電源を入れると、macOS (システムソフトウェア)がストレージからメモリに読み込まれ、それが実行されると(自動的に) Finder アプリケーションが読み込まれ、実行されます。赤矢印はメモリ中への読み込みを意味します。

image-20240303143209942

そこで Finder を操作して MS Word を起動していたわけです。同様にターミナルについても Finder を操作して起動しましたね。青矢印はアプリケーション間の起動(呼び出し)関係を概念的に示しています。(ただ少し複雑なのですが、Terminal は自動的にシェル(zsh プログラム)を起動するようにできています。zshに関する赤矢印=メモリへの読み込み作業は省略しています。)

image-20240303143133705

さてターミナルのコマンドプロンプトに「 date 」と入力してコマンドとして date プログラムを実行していました。コマンドプロンプトは zsh が出していますから、つまりこの場面では zsh が date を起動(呼び出し)していたわけです。(dateに関する赤矢印は省略しています。)

image-20240303143252591

(再掲)MS Word も date も同じアプリケーション・ソフトウェア

再掲します。

つまり MS Word と date は、その起動のための操作が異なるだけで、どちらも実行可能なプログラムである(アプリケーション・ソフトウェアである)という意味では同じものです。コンピュータのストレージの中に置かれたプログラムを、メモリ中に読み込んで CPU に実行させているだけなのです。

上の太文字部分を「その起動操作が Finder による GUI か、ターミナル(シェル)による CUI かで異なるだけで」と読み替えることが出来るでしょうか。

補足2. date プログラムのファイルはどこにあるか

Word アプリケーションはストレージの中では「アプリケーション」フォルダにあります。

image-20240102120350097

date コマンドのストレージ中の場所は which コマンドで知る事ができます。

yasuda@Lily ~ % which date
/bin/date           <<< /bin ディレクトリ(フォルダ)以下の date という名前のファイルだ
yasuda@Lily ~ % 

また、そうやって調べたディレクトリ /bin を open コマンドに指定すると、そのディレクトリを Finder で開くことができます。するとそこに bin という名前のファイルを確認できるでしょう。

image-20240102120800515

これが date プログラムファイルです。

なお、これをダブルクリックして実行することもできます。

image-20240102121110164

警告:適当にあれこれダブルクリックして実行しない
そもそもコマンドは無闇やたらに実行すると予期せぬトラブルを引き起こす可能性があります。/bin ディレクトリ以下にあるコマンドファイルが「見えているから」といって適当にダブルクリックして何が起きるか試す、といったことをしないように。

注意深く見るとこの「本来コマンドとして実行されるプログラムファイルを Finder のダブルクリック操作で実行する」のは、かなり特殊な事をしている事が分かります。

ターミナルの画面に出ているメッセージをよく見れば上の挙動が把握できると思いますが、慣れない人にはちょっと難しいかもしれません。

補足3. ターミナルとは何か

1970年代から1980年代あたりまで、業務処理の主流は大型汎用機あるいはメインフレームと呼ばれる種類のコンピュータを使っていました。まだGUIは無く、操作は主にコマンドによって行っていました。そのとき、大型汎用機の本体に接続してコマンドの入力、結果の表示に用いられていたのが「ターミナル(Terminal, 端末装置)」と呼ばれるものです。

例えば以下の写真は1979年のNEC製コンピュータですが、三台のターミナルが接続されているのが分かります。一台のコンピュータを最大3人が並列に操作することが可能だったわけです。

image-20240309164153667

例えば1980年代後半〜90年代前半の京都産業大学には、30台以上のターミナル(下の画像のVT-100他)を設置した実習室が幾つもあり、一台の大型機にそれらを接続してプログラミング演習などを行っていました。これが当時としてはごく普通のコンピュータ利用環境でした。

つまりMacの「ターミナル」アプリケーションは、このターミナルのディスプレイを模したウィンドウを開いて、ユーザから「昔ながらのやり方」でコマンドの入力、結果の表示ができるように作られたものです。

image-20240309162425205

あなた方がもしターミナルのウィンドウを三つ開いていた場合、つまりあなたは自分の Mac に三台のターミナルを接続して、それぞれから一台のMacをコマンドによって操作していることになります。そのイメージを持っておくと良いでしょう。

ターミナル・エミュレータ
「ターミナルを模している(模倣している)ソフトウェア」という意味で、このようなソフトウェアは「ターミナル・エミュレータ」と呼ばれます。多くのターミナル・エミュレータは上のVT-100のエミュレーションを行っています。Macのターミナルのウィンドウサイズはデフォルトでは80文字 x 24行 構成ですが、VT-100 も80x24です。ターミナルの「設定」画面の「詳細」の terminfo 項目は「 xterm-256color 」がデフォルトですが、xterm は VT-100 を模したものですし、そのメニューにも VT-100 があります。古い話をしているように思うかもしれませんが(Linux が余りにも成功した事もあり)今後何十年かはこの形が残ると思います。