Daily ASCII Linux

All ASCII Linux Issue / Linux Magazine 2000年5月号

覚えておきたい必須コマンド30―その5・シェルを使おう

コマンドを使うために、まずはシェルのbashを使いこなせるようになろうではないか。


2001年6月27日

はじめに

Linux magazine logo


Linux magazine 5月号表紙
本記事も収録 Linux magazine 2000年 5月号 1390円
最近のLinuxはセットアップ完了後にリブートするとX Window Systemが立ち上がり、シェルをまったく意識しなくてもある程度使えるようになっている。しかし、ちょっと高度な操作を行おうとした場合には、どうしてもシェルを利用せざるを得ない。ここでは、Linuxのほとんどのディストリビューションで標準として採用されているbashの使い方を中心に、解説していく。


(山岸典将)


シェルとはなにか

読者の中には、今までWindowsやMacintoshしか使ったことがなく、Linuxを使い始めたばかりの方、LinuxもXからログインし、すべてをX上のGUIで行っている方もいるかもしれない。このような、GUIベースの操作ができるようになったことが、Linuxが普及した理由のひとつであることは間違いない。もちろん筆者もGUIの便利さを否定する気はないし、これからもGUIはどんどん使いやすくなっていくだろう。しかし、Linuxの本来の力を引き出すには、シェルの活用は欠かせないものなのだ。

では、シェルとはなんだろうか。簡単にいえば、シェルはプログラムの実行のためのインターフェイス、そして簡単なプログラミング言語というのがその答だ。ユーザーによるコマンドラインからの入力は、まずシェルが受取り、それを解釈して、コマンドを実行する。

UNIXのシェルといえば、昔はshかcshだったが、今はそれらのシェルを元にしたbash、tcsh、zshといった高機能なシェルが開発されている。ここでは、Linux標準のbashを例にとって解説する。

(山岸典将)


コマンドライン編集

グラフィカルログインをしている場合など、Xでシェルを利用するには、ターミナルエミュレーションソフトを使う。メニューの中から「Xterm」、「kterm」、「Gnomeターミナル」、「日本端末」といったものを実行すればよい(画面1)。テキストログインならば、ログインすればもうそこがシェルの画面だ。

画面1
画面1 メニューからターミナルエミュレーションソフトを選ぶ Laser5 Linuxではメニューの「ユーティリティ」から「日本端末」を選択するとktermが起動する。

シェルが立ち上がると、最初に表示されるのは“[nor@mr2 nor]$”といった文字だ。これは、シェルが「コマンドの入力を受け入れる」ことを意味しているプロンプトだ(画面2)。プロンプトは現在の状況を簡単に示している(図1)。実際には、これらの文字列は設定によって変更することができる。

画面2
画面2 ktermを起動したところ シェルが立ち上がるとまずプロンプトが表示される。

図1
図1 プロンプトの意味する内容の例

ここで、さまざまなコマンドをタイプするわけだが、シェルにはいくつかの編集機能が用意されている。Back Spaceキーで直前の文字を消し、カーソルキーでコマンドラインに打ち込んだ文字列の中を移動することができることに気が付いている人も多いだろう。しかし、コントロールキー(Ctrlキー)やメタキー(Altキーになっていることが多い)との組み合わせで、さらに強力な編集機能を使うことができる。

特に覚えておくと便利なのは、表1の機能だ。

表1 bashのコマンドライン編集機能
オプション名 説明
Ctrl-B カーソルを左に移動
Ctrl-F カーソルを右に移動
Ctrl-A カーソルを行の先頭に移動
Ctrl-E カーソルを行の終りに移動
Ctrl-H(Back Space) カーソルの左の1文字を削除
Ctrl-W カーソル位置の単語を削除
Ctrl-K カーソル位置から行末までの文字列を削除
Ctrl-U 行頭からカーソル位置までの文字列を削除
Ctrl-Y 直前に削除した文字列を貼り付け

これらの機能を使えば、タイプミスやコマンドの引数の順番を間違えたときも、簡単に修正できる。このほかにも、たくさんの編集コマンドが用意されており、それらは“man bash”とタイプして読むことができるオンラインマニュアルに詳しく記載されている。

また、Tabキーによるファイル名補完機能も、便利な機能のひとつだ。まず、コマンドラインで“ls -l .bash_p”までをタイプしてみよう。


$ ls -l .bash_p

ここで、Tabキーをタイプする。


$ ls -l .bash_profile

“rofile”という文字列が補完されたのがわかるだろう。これは、“.bash_p”で始まるファイルがそのディレクトリには.bash_profileしか見つからなかったので、Tabキーを押すことによってbashがファイル名を補完してくれたのだ。

では、複数のファイルが見つかった場合はどうなるのだろう。“ls -l .”とタイプして、Tabキーをタイプしてみてほしい。


$ ls -l .

なにも起こらない。そこでもう1度、Tabキーをタイプしよう。“.”で始まるファイルがすべて表示されたはずだ。Tabキーによる補完機能は図2のようになっている。

図2
図2 Tabキーによる補完機能

(山岸典将)


コマンド履歴

実際にシェルで作業をしていると、以前と同じ入力を繰り返したいときがよくある。bashは以前入力したコマンドを回数分覚えているので、そのようなときは、履歴機能を使うと、すばやくコマンドを入力することができる。

筆者の場合、もっともよく使うのが、Ctrlキーと組み合わせた履歴の呼び出しだ。コマンドラインで、Ctrl-Pをタイプしてみよう。直前に入力したコマンドが表示されるはずだ。ここで再度、Ctrl-Pをタイプすると2回前に実行したコマンドが表示される。こうして、以前に入力したコマンドを呼び出すことができる。もし、いきおい余って過去に戻りすぎてしまったら、Ctrl-Nをタイプすれば履歴を1回分ずつ戻ってくる。↑↓(上下カーソルキー)でも、履歴を呼び出すことができるので、こちらを利用しても構わない。

しかし、しばらく前に入力したコマンドを呼び出すには、もっとよい方法がある。履歴の内容を検索するCtrl-Rコマンドだ。

コマンドラインでCtrl-Rをタイプすると、プロンプトが以下のように変わる。


(reverse-i-search)`'):

ここで、以前入力したコマンドの一部の文字列をタイプしてみよう。以下のように以前に入力されたコマンドが表示されるはずだ。ここで、Enterキーをタイプすれば、そのコマンドを実行できる。もし、利用したい履歴が別のものであれば、さらにCtrl-Rをタイプすることによりさかのぼって検索することができる。


(reverse-i-search)`mv'): mv foo.txt /tmp

さらに、ここでCtrl-PやCtrl-Rで呼び出した履歴は、前に書いたコマンドライン編集機能で編集することもできる。

また、“!”を利用した、簡単な履歴機能もある。以前使ったコマンドをキチンと覚えているならば、


$ !str

とタイプすることで、履歴の中にある“str”から始まるコマンドを再び実行する。直前のコマンドに限っては“!!”とタイプするだけで実行する。

また、シェルで作業中には、直前のコマンドの引数をもう1度、別のコマンドの引数として利用したいときもあるだろう。そんな場合には“!*”を使う。たとえば、あるファイルを編集して、それをコンパイルしたいときなどは、まず、


$ vi foo.c

で、編集し


$ cc !*

とタイプすることにより、“!*”の部分が“foo.c”に展開され、“cc foo.c”というコマンドを与えたのと同じになる。これにより、foo.cをコンパイルすることができる。

(山岸典将)


エイリアス

シェルでは、あるコマンドに対して別の名前を割り当てることができる。これをエイリアス(別名定義)といい、指定は以下のようにする。


$ alias lsl='ls -alF'

これにより“lsl”とタ イプすることにより“ls -alF”が実行されるようになる。現在定義されているエイリアスをすべて表示するには、なにも引数をつけずにただ“alias”とタイプすればよい。

もし、定義されているエイリアスを無効にしたい場合には、“unalias”コマンドで無効化できる。


$ unalias lsl

実際には、エイリアスの設定は、あとで述べる初期設定ファイルに記述しておくことがほとんどだろう。

(山岸典将)


変数とはなにか

変数は、シェルやその他のプログラムが実行時に利用するもので、ふつうはユーザーの名前や、ターミナルの設定、言語環境の設定、そして個別のプログラムのための設定など、さまざまな情報が数値や文字列としてあらかじめ設定されている。また、変数にはシェル変数と環境変数の2つがある。

まず、シェルから“set”とタイプしてみよう。そのシェルで設定されている変数が大量に表示されるはずだ。

シェル変数の定義方法は、単に変数とその値を“=”で結べばよい。


$ FOO=txt

これで、変数FOOに“txt”が設定される。そして、その変数は、変数名の前に“$”をつけることで利用できる。引数に指定された文字列を出力するechoコマンドで試してみよう。


$ echo $FOO
txt
$ ls
aaa.txt  bbb.tif  ccc.txt  ddd.tif
$ ls *$FOO
aaa.txt  ccc.txt

最後のlsコマンドでは、$FOOが“txt”に展開され、ls *txtというコマンドになったのがわかるだろう。

最低限必要な変数に関してはシステムに最初から設定されている。シェルを使い始めたばかりのうちはあまり変数を使うこともないだろうが、覚えておいたほうがよい変数もある。

そのひとつが、PATH変数だ。このPATH変数は、入力されたコマンドをシェルが探しに行く場所(パス)を設定している。つまり、ここで設定されていない場所にあるコマンドを起動するには、コマンドがある場所も指定しなくてはならないということだ。存在するはずのコマンドを入力したのに、「command not found」となってしまう場合には、そのコマンドが存在する場所がPATH変数に設定されていない可能性がある。

また、このPATHに関しては、現在いるディレクトリ(カレントディレクトリ)は含めないのが一般的なので注意しよう。特にMS-DOSをよく知っているユーザーが引っ掛かりやすい。カレントディレクトリにあるコマンドを実行するには、コマンド名の前にカレントディレクトリ意味する“./”をつける。


$ ./command

なお、基本的にシェル変数の設定は、そのシェルのみで有効となり、別のシェルには影響しない。ということは、X上で複数のターミナルを開いていた場合、あるターミナルで変数を変更しても、別のターミナルではその変数は変更されない。そのうえ、そのシェルから起動したプログラムも、シェル変数を参照することはできない。

しかし実際には、変数を利用してさまざなプログラムの設定を行いたい場合が多い(日本語環境の設定も変数で行っている)。そこで、シェル変数をそのシェルから起動したプログラムに引き継がせるための、“export”というコマンドが存在する。


$ export FOO

exportされたシェル変数は、環境変数となり、そこから起動された(シェルを含む)プログラムに引き継がれることになる(図3)。実際にこのexportがどのように使われるかについては、次の「bashの初期設定」で解説しよう。

図3
図3 変数とexport

(山岸典将)


bashの初期設定

最後にシェルの初期設定の方法について解説しよう。

bashの初期設定ファイルは、/etc/profileと、各ユーザーのホームディレクトリにある.bachrc、.bash_profileの3つだ。この3つのファイルの違いは、まず、/etc/profileにはシステム全体としての設定が書かれており、残りの2つは、ユーザーによる設定ファイルだということ。そして.bashrcがシェルの起動時に読み込まれ、/etc/profile、

.bash_profileがログイン時に読み込まれるというところにある(図4)。

図4
図4 bash設定ファイルの読み込みタイミング

つまり、Xでターミナルを開くたびに.bashrcは実行されるが、/etc/profile、.bash_profileはログイン時にのみに実行される。ということは、ユーザーは.bashrcにはエイリアスのようなシェルの基本的な動作の設定を書いておき、.bash_profileにはログイン時にのみ行いたい処理を書いておけばよいわけだ。なお、実際には最初から用意された.bash_profileには.ba shrcの設定もログイン時に読み込むように設定されている。

.bash_profileに登場するのが、先ほどのexportだ。一般に変数に関しては.bash_profileで設定され、exportされることになる。.bash_profileはログイン時に読み込まれるので、それ以降に起動されたプログラムに関しては、すべて.bash_profileでexportされた変数が引き継がれることになるからだ。

・bashの初期設定のポイント
1. エイリアスは.bashrcに書く
2. 環境変数は.bash_profileに書いて、exportする。

以上、簡単なシェルの使い方について解説してきた。シェルのさらなる活用法については、ぜひ本誌連載の「賢く使うUNIX」を読んでいただき、「スマートなUNIX使い!」を目指してほしい。

(山岸典将)




[通常ページに戻る]
ASCII24 http://ascii24.com/
Copyright (C)1999-2006 ASCII Corporation. All rights reserved.