Unixコマンド入門

この資料は、MacOSを使っていることを前提として書かれています。Windows 10を使っている場合には、WSL(Windows Subsystem for Linux)を使ってUbuntuなどをインストールしてください。

1 Unix

UnixはOSの名前です。Unixには多くのバージョンや派生OSが存在するので、UnixはOSのカテゴリ名だと言っても良いかもしれません。Unix系OSという言い方もありますね。厳密にいうと、Unixは商標登録されていて、Unixという名前を使うには決まり事があります。この授業ではこの辺の詳しい事情は扱いません。

どのOSをUnix系OSと呼ぶかについては色々な議論がありますが、この授業では元々のUnixとほぼ同じコマンドを用いて操作できるものを扱います。具体的に言うと以下のようなOSです。

  • GNU/Linux
  • MacOS

GNU/Linuxは通常ディストリビューションという形で配布されます。Linuxディストリビューションとは、Linuxカーネルと呼ばれるOSの主要部分と、それ以外のソフトウェアをひとまとまりにしたものです。以下のようなディストリビューションが有名です。

  • Ubuntu
  • Debian
  • Fedora
  • CentOS
  • openSUSE

2 コマンドライン

Unixは、開発当初から1台のコンピュータに複数の端末(ターミナル)を繋いで使うことが想定されていました。当初はGUIはなく、コマンドを一行一行打ち込んで操作をしていました。このような方式をコマンドラインを使った操作と呼びます。これは現在でも引き継がれていて、基本的にUnixはGUIを必要とせず、OSに関する基本的な操作は全てコマンドラインからの入力で行うことができるようになっています。

MacOSでは、「ターミナル」というアプリケーションを使ってコマンドラインによる操作ができるようになっています。このように、コンピュータのアプリケーションとしての端末(ターミナル)は、大昔に存在した機械として作られた端末と区別するために端末エミュレータと呼ばれることもあります。

大昔の機械として作られた端末は、以下のWikipediaの説明などを見ると、どのようなものか知ることができます。

https://ja.wikipedia.org/wiki/VT100

3 MacOSのターミナル

MacOSのターミナルを起動するとウィンドウが開いて、以下のような出力が表示れます。

この画面の1行目は、ターミナルを起動した直後に表示されるメッセージです。2行目に表示されているのはプロンプトです。プロンプトとは、ユーザにコマンドの入力を促すための印です。%プロンプト記号と呼ばれています。

プロンプトは設定によって変えられます。みなさんがターミナルを起動した際には、ここで示した例とは違ったプロンプトが表示されていることと思いますが、気にしなくて良いです。

もしかすると皆さんの環境では$がプロンプト記号になっているかもしれません。これは、どのシェルを使っているのかによって違います。シェルについては後で説明します。

この資料では、ターミナルに入力するコマンドを以下のように示します。

先頭にプロンプト記号があるのが目印です。コマンドを入力したら最後にエンターキーを押します。

シェル

ターミナルを起動すると、その中でシェルというプログラムが起動します。シェルはプログラミング言語の一種で、ユーザから入力されたコマンドを解釈して、対応する操作をOSに伝えます。ただし、しばらくの間はシェルがプログラミング言語であることは忘れていて良いです。

MacOSは長らくbashというシェルを採用していました。つい最近これがzshに変わっています。プロンプト記号が$であればbash(バッシュ)が起動しています。%であればzsh(ジーシェルあるいはゼットシェル)が起動しています。bashを使っているのかzshを使っているのかは、通常は意識しなくて良いです。

シェルで書かれたプログラムをシェルスクリプトと呼びます。シェルスクリプトが書けるようになると色々と便利なことができるのですが、この授業ではそこまで扱いません。

シェルを終了するにはexitというコマンドを使います。

exitをしてからターミナルを終了するのが行儀の良い作法ですが、いきなりターミナルを終了してしまっても特に問題はありません。

4 基本的なコマンド

まずは、簡単なファイル操作をターミナルから行う方法を学びましょう。

ここで学習するコマンドは以下の通りです。

  • cd
  • mkdir
  • pwd
  • touch
  • ls
  • cp
  • mv
  • rm

cd、mkdir、pwd

Finderで、書類フォルダを選び表示しておきます。これからコマンドを使って書類フォルダの中にUnixというフォルダを作成してみます。

ターミナルを起動してください。そこに以下のように入力します。1行ずつ入力してエンターキーを押します。

Finderの画面で書類フォルダの中にUnixが新たに作成されたことを確認してください。

MacOSでは、書類フォルダは特殊な処理がされるフォルダです。フォルダの名前はDocumentsですが、Finderで見るときには日本語の「書類」に自動的に変換されます。このような特殊な処理がされるフォルダとしては、アプリケーション(Applications)、ダウンロード(Downloads)、ピクチャ(Pictures)などがあります。

mkdirはフォルダを作成するコマンドです。ここではUUnixという名前のフォルダを作成しています。

Unixではフォルダのことをディレクトリと呼びます。mkdirというコマンド名は”make directory”を短くしたものです。ディレクトリ(directory)は良くdirと略されます。フォルダと呼ぶかディレクトリと呼ぶかは、さほど神経質にならなくて良いです。どちらもほぼ同じものを指しています。

以下のように実行してください。

以下のような出力が得られるはずです。

pwdはカレントディレクトリを表示するコマンドです。カレントディレクトリとは、今シェルが作業を行っているディレクトリのことです。シェルで何かをする際には、カレントディレクトリがどこなのかを常に意識している必要があります。そのため、多くの場合、プロンプトにそれが表示されているはずです。pwdというコマンド名は”print working directory”の短縮です。カレントディレクトリはワーキングディレクトリともいう、というわけですね。

cdはカレントディレクトリを変更するコマンドです。先ほどmkdir Unixとした後で、cd Unixとしましたね。これはカレントディレクトリを作成したUnixに変更したということなのです。cdというコマンド名は”change directory”の短縮です。

カレントディレクトリを変更することを「○○というディレクトリに行く」と表現することがあります。イメージとしては、自分がディレクトリに居て、cdコマンドで場所を渡り歩いている感じです。

以下のように実行してください。

今度は、以下のような出力が得られるはずです。

cdコマンドは何も引数を与えずに実行すると、カレントディレクトリをホームディレクトリに変更します。ホームディレクトリとは、ターミナルを立ち上げた直後に”居る”ディレクトリのことです。自分の本拠地のようなものです。ホームディレクトリ以下は、自分が好きに使って良い場所とも言えます。

touch、ls

それでは一度ホームディレクトリに戻ってください。cdコマンドを使うんでしたね。

先ほど作ったUnixというディレクトリに行きます。

ここに空のファイルを作ってみましょう。

touchは空のファイルを作るコマンドです。empty.txtというファイルを作りましたが、これが本当にできたかどうか確認してみましょう。

以下のような出力が得られるはずです。

これが本当に空のファイルかも確認しましょう。

-lは、ハイフンとアルファベットのlです。-lはlsコマンドのオプションです。オプションというのは引数とは少し違っていて、コマンドに何か特殊条件をつけるようなときに使われます。

今度は以下のような出力になります。ユーザ名のところにはあなたのユーザ名が入ります。

-rw-r--r--はパーミッション情報です。これは後で説明します。その次の1はリンク数を表しますが無視して良いです。ユーザ名の次に出力されているstaffはグループ名です。その次の0がファイルサイズです。サイズが0ですから、このファイルは空であることが分かります。その後ろはファイル作成日時です。

少し特殊なファイルを作ってみましょう。

.hiddenというファイルを作ったはずなのに表示されないですね。.から始まるファイル名を持つファイルは「ドットファイル」や「隠しファイル」と呼ばれる特殊なファイルになります。ドットファイルを表示するときにはaというオプションを付けます。

今度は.hiddenが表示されましたね。...というものも表示されました。これらに関しては後で説明します。

ls -lals -l -aとしても同じです。Unixのコマンドはこのようなオプションの与え方をものが多いです(全てではないです)。

cp、mv、rm

ファイルのコピーにはcpコマンドを使います。

これでempty2.txtというファイルができましたね。cpというコマンド名は”copy”の短縮です。

empty.txtというファイル名をempty1.txtに変更してみましょう。

lsコマンドを使ってempty.txtがempty1.txtにリネームされていることを確認してください。mvというコマンド名は”move”の短縮です。でもmoveでリネームできるのは変な感じがしますね。本来mvコマンドはファイルの移動を行うコマンドなのです。移動も試してみましょう。

以下のような出力を得るはずです。

subはディレクトリです。これは、drwxr-xr-xの先頭がdになっていることで判別できます。mv empty2.txt sub/を実行すると、empty2.txtはsubというディレクトリの下に移動します。確認してみましょう。

今度はlsコマンドの引数にディレクトリを指定しました。このようにするとカレントディレクトリの下にあるsubというディレクトリの中にあるファイルを表示してくれます。empty2.txtがsubの下に移動していることが確認できるはずです。

それでは、empty1.txtを削除してみましょう。

empty1.txtが消えたはずです。rmというコマンド名は”remove”の短縮です。

次にsubを削除してみましょう。subはディレクトリです。

おや?何か怒られてしまいます。

ディレクトリを削除する際には-rオプションを付けます。

これでsubも削除できたはずです。

ここで一旦ターミナルのウィンドウを閉じてしまってください。

5 ファイル

Unixではファイルという単位で情報を扱います。Unixではこれが徹底していて、ディレクトリもファイルの一種ですし、プリンタやディスプレイといったデバイスもファイルとして扱われます。ここでは、このファイルの操作について、もう少し詳しく見ていきます。

.と..

ターミナルを起動してメニューの「シェル」から「新規ウィンドウ」を選択してください。前のセクションで作成したUnixというディレクトリに移動します。今、このディレクトリには.hiddenというファイルだけが存在しているはずです。

前のセクションで、ls -lの結果を出力した際に、...というディレクトリがありました。ここではそれらについて説明します。

説明を分かりやすくするために、現在のカレントディレクトリであるUnixの下に、appleorangeという2つのディレクトリを作成しておきましょう。

.というディレクトリは、カレントディレクトリを指しています。今の場合は、Unixというディレクトリと.は同じということです。以下の2つの実行結果は全く同じになります。

..というディレクトリは、カレントディレクトリから見て、一つ上のディレクトリを指しています。例で説明しましょう。Unixのしたのappleに移動してください。これでカレントディレクトリはappleになりました。カレントディレクトリを一つ上のUnixに戻すには以下のようにします。

これでUnixに戻ってきました。pwdコマンドを使って確認してください。

もう一度、appleに移動します。ここから一気にカレントディレクトリをorangeに変更するには以下のようにします。

パス

ここでは、ファイルのパスについて説明します。カレントディレクトリはUnixにしておいてください。

Unixのファイルは/をルート(根)とした木構造になっています。この/のことをルートディレクトリと呼びます。

あるファイル(あるいはディレクトリ)の絶対パスとは、ルートディレクトリからそのファイルまでの道筋(パス)のことです。今現在のカレントディレクトリであるUnixの場合、pwdコマンドを使って調べることができます。

以下のように出力されるはずです。

このとき、先頭の/はルートディレクトリで、以降に現れる/は木の枝(エッジ)を表します。同じ記号ですが別の意味なので注意してください。

相対パスとは、カレントディレクトリからそのファイルまでの道筋(パス)のことです。

絶対パスと相対パスについて図で説明すると以下のようになります。

テキストファイル

テキストファイルの内容を出力してみましょう。Unixをカレントディレクトリにしてください。まずは、テキストファイルを準備することから始めます。

これでabc.txtというテキストファイルが準備できました。echoに関しては、後で説明します。

この内容を出力するには、catコマンドを使います。

“abcdefg”と出力されるはずです。catコマンドは”concatenate"の短縮です。concatenateは、連結という意味ですね。本来catコマンドは複数のファイルを連結するためのコマンドです。引数に1つだけしかファイルを指定しないと、そのファイルの内容をそのまま出力します。

連結もやってみましょう。

2つのファイルの内容が連結されて出力されるはずです。

テキストファイルの内容を出力するには、catコマンドの他にmoreやlessと行ったコマンドも使えます。

標準入力と標準出力

Unixのプロセスの入出力先はファイルです。コマンドはファイルからデータを読み込み、ファイルへと出力します。プロセスは、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)と呼ばれる3つの特別な入出力チャンネルを元々備えています。Unixのコマンドも実行されるとプロセスとなります。そしてほとんどのコマンドは、この3つの入出力チャンネルを使って仕事をするように作られています。

標準入力は予めキーボードが割り当てられており、標準出力および標準エラー出力にはターミナルの画面が割り当てられています。実際のファイルでいうと標準入力は/dev/stdin、標準出力は/dev/stdout、標準エラー出力は/dev/stderrです。

シェルには、この標準入力や標準出力、標準エラー出力のファイルを別のファイルに切り替える機能があります。これをリダイレクトと呼びます。

まずは標準出力を別のファイルに切り替えてみましょう。ここでは例としてdateコマンドを使います。dateコマンドは現在の日時を出力するコマンドです。

dateコマンドの出力先は標準出力ですから、ターミナルの画面に日時が表示されます。これをファイルに切り替えてみましょう。

dateコマンドからの出力は、now.txtというファイルになりました。catコマンドでnow.txtに日時が保存されていることが確認できます。

次に標準入力を別のファイルに切り替えてみましょう。catコマンドは標準入力からデータを読み込んで標準出力に出力を行うようになっています。これを確かめてみましょう。catコマンドを引数なしで起動します。

標準入力、つまりキーボードから入力を受け付けるので、”This is a test.”と入力してみましょう。エンターキーを押すと、すぐ下に”This is a test.”と出力されるはずです。コントロールキーとDを一緒に押すと入力が終了します。

今度は標準入力をnow.txtに切り替えます。

日時が出力されたはずです。このように標準出力の切り替えは>で、標準入力の切り替えは<で行います。

では、標準入力と標準出力の両方を切り替えてみましょう。

これで、now.txtの内容はcatコマンドに読み込まれ、その出力がnow_copy.txtに書き込まれます。

パイプ

シェルにはリダイレクトの他にもう一つ、標準入出力に関する便利な機能が備わっています。パイプです。
パイプとは、あるコマンドの出力を別のコマンドの入力につなげるという機能です。

ここではechoコマンドとsortコマンドを使って説明します。echoコマンドは、引数に指定した文字列をそのまま標準出力に出力します。もちろん引数の代わりに標準入力から文字列を受け取ることもできます。

“\n”は改行です。結果は、4、2、5、3、1と縦に出力されるはずです。

この出力をsortコマンドを使って昇順に並べ替えてみます。

今度は以下のようになるはずです。

このパイプがやっていることは、最初のコマンドの出力を中間ファイルに出力して、それを次のコマンドに入力することと同等です。

テキストエディタ

テキストファイルを作るにはテキストエディタを使います。Unixには元々テキストエディタがコマンドとして付属しています。それがedコマンドとviコマンドです。edコマンドがラインエディタ、viコマンドがスクリーンエディタです。edを使う場面は全くないと思うので、ここでは説明をしません。viは簡単な使い方を覚えておくと役に立つ場面があります。

viは少し慣れが必要なエディタです。viを起動するとターミナル全体がエディタ画面になります。viにはモードという概念があり、入力モードコマンドモードを切り替えて使います。viを起動した直後にはコマンドモードになっています。入力モードにするには、”i”を入力します。画面の最下行にinsertと表示されるはずです。これで入力モードになります。コマンドモードに戻るためにはエスケープキーを押します。

一度、viを起動して終了してみましょう。終了するにはコマンドモードで”:q!”と入力します。

viを起動する際にファイル名を引数として指定すると、そのファイルがある場合にはそれを開き、ない場合には新規で作成します。

インサートモードにして、ファイルに何か書き込んでください。これを保存するにはコマンドモードにして”:w”と入力します。保存して終了するには”:wq”とします。

viの使い方については、ここではこれ以上説明しません。インターネット上で検索すると使い方を説明した資料はたくさん見つかるはずです。viの他に、Unixの標準コマンドではないですが有名なテキストエディタとしてemacsとnanoがあります。これらについても興味がある人は調べてみてください。

6 コマンドの場所

Unixはカーネルと呼ばれるOS本体と、標準コマンド、標準コマンドを実行するために必要となるライブラリから構成されています。今更強調するようなことではありませんが、コマンドはプログラムです。プログラムであるからには、ファイルとしてどこかに存在しているということになります。このコマンドが置かれている場所を知らなくても、当面困ったことにはならないのですが、知識としては知っていた方が良いと思います。

Unixの標準コマンドは、/binか/usr/binの下にあります。/binは「スラビン」あるいは「ビン」、/usr/binは「スラユーザスラビン」「ユーザスラビン」「ユーザビン」などと読む人が多いです。lsでどんなコマンドがあるか調べてみましょう。

/binにあるコマンドは、一番基本的な、そして最古のコマンドです。lsやcp、cd、pwdなどがありますね。/usr/binは、Unixが進化をする過程で色々な人たちが作り上げてきたコマンドなどが置かれています。viもここにあります。

ちなみにbinは”binary”の短縮です。2進表現、つまりマシン語で書かれたファイルということで、実行可能なプログラムに対して付けられた呼び名です。usrは”user”の短縮です。Unixな人たちは3文字が好きだったんですね。

ただし、どのようなコマンドが/binや/usr/binにあるかはOSの種類によって違います。MacOSとUbuntuでは当然違っています。この辺は実際にシステムを使ってみて確認する必要があります。

しかし、cdやlsなどのコマンドは、わざわざ/bin/cd/bin/lsとしなくてもいきなりcdと起動できますよね。これはシェルにそういう機能があるからです。具体的にはPATHという環境変数に指定されたパスに置かれているプログラムは、いきなり実行できるという仕組みになっています。

環境変数とは、シェルの変数の一種です。PATHという変数にどのような値が代入されているのかを確認してみましょう。

シェルの変数は参照する際に頭に$を付けるという決まりがあります。PATHの値は”:”で区切られたパスのリストになっています。ここに/binや/usr/binなどが定義されているのが確認できるはずです。このPATHに代入されている文字列を書き換えることで、コマンドを置いておく場所を変えることができます。

7 ファイルのパーミッション

ファイルのパーミッションというのは、ファイルに対してどのような操作が許可されるのかをユーザ毎に定めたものです。これはセキュリティの仕組みの一つです。

パーミッションについて説明する前に、Unixにおけるユーザとグループという概念を説明しておきます。ユーザはUnixにログインする際に使われる名前です。グループはユーザの集合です。ユーザは最低1つのグループに属しています。複数のグループに属することも可能です。この仕組みにより、ある特定のユーザに対して何かを許可したり、ユーザのグループに対して何かを許可したりすることができます。

ファイルには所有者とグループという情報が付加されています。この情報はls -lによって見ることができます。

ファイルのパーミッションは、最初の方に出力されているrやw、xなどの部分を見るとわかります。これは以下の図に示すように4つの部分に分かれています。

最初の1文字は、このファイルがディレクトリであるか否かを示しています。ディレクトリの場合にはdとなり、そうでない場合には-となります。ownerはこのファイルの所有者に許可されていること、groupはこの指定されたグループに属するユーザに許可されていること、otherは第三者に許可されていることになります。

ファイルがディレクトリでない場合には、rはこのファイルを読むことができる、wは編集することができる、xは実行することができるという意味になります。ファイルがディレクトリの場合には、rはディレクトの中を表示できる(lsでファイルの一覧を見ることができる)、wはディレクトリの中に新たにファイルを作成できる、xはディレクトリの中のファイルにアクセスできるという意味になります。

パーミッションを指定する際には、rwxのそれぞれの情報に1ビットずつ割り当てて、0から7までの数字を使います。以下に例を示します。

所有者、グループ、第三者の3つの区分けがありますから、3ビットの数字が3つ並ぶことになります。上記の例では644ですね。このファイルに対して同じグループに所属しているユーザが編集できるようにしてみましょう。パーミッションの設定にはchmodコマンドを使います。

以下のようにパーミションが変わったことを確認してください。

8 マニュアル

Unixのコマンドは、manコマンドを使って使い方を調べることができます。

pwdの使い方が出てきますね。manコマンドの結果はless(またはmore)というコマンドに渡されて出力されます。lessはページャと呼ばれるコマンドで、長いテキストファイルをページ単位に見れるようにするものです。スペースキーで次ページ、jキーで1行下、kキーで1行上に移動できます。終了するにはqキーを押します。また/キーで検索も可能です。このキーバインディングはviとほぼ同じです。

以下のコマンドについて、manコマンドを使ってどんなコマンドであるかとその使い方を調べておきましょう。

  • ps
  • less
  • chown
  • du
  • df
  • sudo