プログラミング入門(金曜1・2限)講義資料(2008年後期)

コマンドラインの使い方

みなさんの環境では,Linuxと呼ばれるオペレーティングシステム(OS)が動作しています.Linuxは,UNIXと呼ばれる昔からあるOSの一種です.昔のコンピュータではグラフィックスは使えなかったので,ユーザは文字しか表示できないディスプレイとキーボードがついた端末(ターミナル)を使っていました(CUI環境).例えば,有名なターミナルに,VT100と呼ばれる製品があります.(DECマシンの歴史の1978年8月のところ参照.)

今ではUNIXでもGUI環境を使うことができますが,昔からのCUI環境も使われています.CUIを使うためには,(本物の)端末を,GUIの画面上でエミュレートするソフトウェア(ターミナルエミュレータあるいは端末エミュレータと呼ばれます)を使用します.

最初の一歩

みなさんの環境では,ターミナルエミュレータとしてmltermを使用します.下のパネルのconsole
imageをクリックするとmltermが起動します.

一見エディタに似ていますが,中身は全然違います.ちょっと使ってみましょう.

[k-abe@x10a03 ~]$の部分はプロンプトと呼ばれています.これは,コマンドを入力できる状態であることを示しています.「命令をどうぞ」くらいの意味です.

ターミナルエミュレータ自体は文字を表示したり,キー入力を受け取ったりする機能しかありません.プロンプトを表示しているのは,ターミナルエミュレータの上で動いているシェルと呼ばれるプログラムです.シェルは,人から与えられる命令をコンピュータに仲介する役割を果たします.

シェルに対して,キーボードから命令を与えることができます.試しに ls (エルエス)と入力して Enter キーを押してみて下さい.これは,lsコマンドを実行するように命令したことになります.

lsコマンドを実行すると,ホームディレクトリにあるファイルのリストが表示されるはずです.lsコマンドは,ファイルのリストを表示するコマンドです.

次に ls -l と入力して下さい.Enter キーを忘れずに.今度はファイルのリストが別の形式で表示されたと思います.

このように,コマンドにはハイフンに続けて文字を指定すると,動作を変えることができるものがあります.このような文字のことをオプションと呼びます.ls の -l オプションは,詳細な形式でファイルリストを表示させるためのオプションです.

皆さんのホームディレクトリには Desktop というディレクトリがあるはずです.今度はls -l Desktop と入力してみて下さい.今度は Desktop ディレクトリの中身が表示されたと思います.lsコマンドでは,このように「どのディレクトリやファイルを表示するか」を指定することができます.指定している部分を引数と呼びます.

まとめると,lsコマンドの書式は以下のようになります.

ls [オプション] [ファイル または ディレクトリ ...]

角かっこ[]で囲まれた部分は省略可能という意味です.

また,... は,複数書いても良いということを表しています.

lsコマンドのオプションは,-l 以外にも沢山あります.例えば -F を指定するとディレクトリの後に / をつけて表示します.

ディレクトリの復習

UNIXでは,階層的なディレクトリ構造が使用されていて,その一番根本がルートディレクトリと呼ばれています.それを / で表します.

試しに ls / してみると,ルートディレクトリにどのようなものがあるのか確認できます.

皆さんのホームディレクトリも,ルートディレクトリから辿っていくことができます.そのために,カレントディレクトリを表示するコマンドpwdを使ってみましょう.例えば以下のようになるでしょう.

  [... ~]$ pwd
  /var/.automount/home1/home/staff/k-abe
  

これは,「ルートディレクトリにある var ディレクトリの下の .automount ディレクトリの下の… staff ディレクトリの下の k-abe というディレクトリ」という意味です.ここがホームディレクトリというわけです.

このように,/ から始めて,ディレクトリ階層を / で区切って書いていくことで,システムにあるファイルやディレクトリを一意に指定することができます.このような表記を絶対パス名と呼びます.

コマンドラインでディレクトリを扱う

今度はディレクトリを作成してみましょう.ディレクトリの作成にはmkdirコマンドを使います.mkdir は MaKe DIRectory の略です.mkdir Javaとすると Java という名前のディレクトリを作成できます.作成したら,ls コマンドで確認してみましょう.

  [... ~]$ mkdir Java
  [... ~]$ ls
  Desktop Java public_html
  

今まではホームディレクトリで作業していましたが,今度は作業場所を変えてみましょう.作業場所のことをカレントディレクトリ(あるいは作業ディレクトリ)と呼びます.UNIXのコマンドでは,特に指定しなければカレントディレクトリにあるファイルを取り扱います.

作業場所を変えるためには,cdコマンドを使います.cd は Change Directory の略です.cd Javaとすると,カレントディレクトリを Java ディレクトリに変更できます.

cd Java を実行すると,プロンプトに ~/Java と表示され,カレントディレクトリが ~/Java であることを示します.この~記号(チルダ)は,ホームディレクトリを表すことになっています.つまり ~/Java はホームディレクトリにある Java ディレクトリという意味です.

試しにこの状態で pwd してみましょう.Java という部分が増えているはずです.

  [... ~]$ cd Java
  [... ~]$ pwd
  /var/.automount/home1/home/staff/k-abe/Java
  [... ~/Java]$
  

ls してみると,Javaディレクトリにはファイルが何もないことが分かるでしょう.

  [... ~/Java]$ ls
  [... ~/Java]$
  

慣れないうちは cd したら ls してどのようなファイルがあるのかを確認しましょう.

この Java ディレクトリの中に,さらに test1 と test2 というディレクトリを作ってみましょう.mkdirコマンドでは,複数のディレクトリを一度に作成することができます.mkdirに限らず,UNIXのほとんどのコマンドでは複数のファイル名やディレクトリ名を一度に指定することができます.

  [... ~/Java]$ mkdir test1 test2
  [... ~/Java]$ ls
  test1 test2
  [... ~/Java]$
  

カレントディレクトリを test1 ディレクトリに移します.

  [... ~/Java]$ cd test1
  [... ~/Java/test1]$ ls
  [... ~/Java/test1]$
  

今度は,Java ディレクトリに戻ってみましょう.一つ上のディレクトリに戻るには,cd ..とします...は一つ上のディレクトリ(ここではJavaディレクトリ)を意味します.

  [... ~/Java/test1]$ cd ..
  [... ~/Java]$ ls
  test1 test2
  

ここからホームディレクトリに戻るには,また cd .. としても良いですが,cd コマンドには引数をつけずに実行するとカレントディレクトリがどこにあってもホームディレクトリに戻るようになっているので,単に cd だけで良いです.

  [... ~/Java]$ cd
  [... ~]$ ls
  Desktop Java public_html
  

ホームディレクトリから先ほど作った test1 ディレクトリにはcd Java/test1 とすれば一発で移動できます.

  [... ~]$ cd Java/test1
  [... ~/Java/test1]$ 
  

あるいは,cd ~/Java/test1 とする方法もあります.この方法では,カレントディレクトリがどこにあっても ~/Java/test1 ディレクトリに移動できます.

test1 から test2 へ移動するには cd ../test2 とします.

  [... ~/Java/test1]$ cd ../test2
  [... ~/Java/test2]$ 
  

コマンドラインを使う時は,常にカレントディレクトリを把握しておく必要があります.

なお,カレントディレクトリがプロンプトに表示されるのは,センターの計算機がそのように設定されているからで,世の中ではプロンプトにカレントディレクトリが表示されないシステムの方が普通です.

ファイル名の指定方法

コマンドラインでファイル名を指定するときに,

になります.例えば,カレントディレクトリが /usr の時,cd bin するとカレントディレクトリは /usr/bin に移りますが,cd /bin するとカレントディレクトリは /bin に移ります.

親ディレクトリは .. で表します.2つ上のディレクトリは ../.. です.

たいていのコマンドではファイル名を複数指定できます.例えば mkdir foo bar baz とすれば,foo,bar,bazという三つのディレクトリを一度に作成できます.

良く使うコマンド

コマンド 解説
ls (LiSt) 引数をつけなければカレントディレクトリのファイルリストを表示します.

引数にファイル名やディレクトリ名をつけると,指定したファイルやディレクトリの情報を表示します.

オプションとして -l をつけると,より詳細な情報を表示します.

cd (Change Directory) カレントディレクトリを,引数で指定したディレクトリに移動します.
引数がない場合はホームディレクトリに移動します.
pwd (Print Working Directory) カレントディレクトリを表示します.引数はありません.
mkdir (MaKe DIRectory) 引数で指定したディレクトリを作成します.
rmdir (ReMove DIRectory) 引数で指定したディレクトリを削除します.ディレクトリは空でないとエラーになります.
cp (CoPy) cp file1 file2 のように使うと,file1file2という名前でコピーします.

cp file1 file2 ... directoryのように使うと,file1, file2, ...を最後に指定したディレクトリに同じ名前でコピーします.

rm (ReMove) 引数で指定したファイルを削除します.消去してよいですか?とは聞いてこないので注意してください.
cat (ConcATenate) 引数で指定したファイルを表示します.これは垂れ流すだけで,検索や気の効いたことはできません.短いファイルを表示するには十分.
less 引数で指定したファイルを表示します.カーソルキーやPage Up/Downキーでスクロールさせたりいろいろできます.終了するには q を押してください.
man (MANual) 引数で指定したコマンドのマニュアルを表示します.例えば,ls コマンドのマニュアルを見るには man lsとします.センターの環境ではマニュアルは less を使って表示されます.
date 現在の日時を表示します.
cal カレンダを表示します.

楽をするための方法

CUIでは沢山キーボードを叩きます.このため,なるべくキーボードを叩かなくて済むような工夫があります.

これらの機能は是非覚えて下さい.効率が断然違うはずです.

ワイルドカード

例えば,ホームディレクトリにあるtest1.txt,test2.txt,test3.txt,test4.txt のようなファイルが山ほどあって,全て削除したいときに,

  [... ~]$ rm test1.txt test2.txt test3.txt test4.txt...

のように入力するのは苦痛です.こういうときは,

  [... ~]$ rm test*.txt

と書けます.* はワイルドカードです.この場合だと「testの後に0文字以上の何かがあって,その後に .txt と続くファイル全て」という意味になります.いろいろと応用ができます.

間違って rm * としてしまうと,カレントディレクトリのファイル全てを一瞬で消してしまいますから注意しましょう.

ヒストリ機能

CUIでは,同じコマンドを何度も入力することがあります.その度にキーボードを毎回入力するのは馬鹿らしいということで,一度入力した行(コマンドライン)は再利用できるようになっています.プロンプトが出ている状態でカーソルキーの上を押してみてください.一つ前に入力した行が呼び戻されます.もう一度上を押せば,その前の行が呼び出されます.

そのまま Enter を押せば再度実行されます.また,呼び戻した行を変更してから実行することも可能です.

補完機能

CUIでは,ファイル名(やディレクトリ名)を入力する場合が沢山ありますが,すでに存在するファイル名ならば,簡単に入力することができます.

例えば,カレントディレクトリを ~/Java/test に移したい場合,cd ~/J まで入力してTabキーを押すと,勝手にcd ~/Java/ まで自動的に入力してくれます.これは,J から始まるファイルが一つしか無かったので,自動的に補完してくれたのです.

さらにTabキーを押すと,cd ~/Java/test まで入力してくれます.これは Java ディレクトリの下には test しか存在しないからです.

もし Java の下に test の他に text というディレクトリがあった場合,cd ~/Java/ でTabキーを押すと次のようになります.

  [... ~]$ cd Java/[tab]
  test/ text/
  [... ~]$ cd Java/te
  

Java の下には test と text というディレクトリがあるということを教えてくれています.さらに,te まで補完してくれているので,s を入力して再度Tabキーを押せば cd Java/test/ と入力が完了します.

Tabキーは,ファイル名を入力していて,「あれ,ファイル名なんだっけ?」というような時にも役に立ちます.

ファイル名を入力するときは数文字入力してTabを押してみましょう.

コピー&ペースト

ターミナルエミュレータ上でのコピー&ペーストは次のようにします.

領域をコピーするには左ボタンでドラッグします.ペーストは真ん中ボタンです.

参考になるページ集