最低限 Unix / Linux [II] 【3. シェル】

  1. 事前準備
  1. パーミッション
  1. シェル
  1. テキストエディタ
  1. シェルスクリプト
  1. 本日の課題
情報実験第 3 回トップへ

続いて学ぶのはシェルについてです. レクチャーで学んだとおり, シェルは人間と計算機の仲介をするソフトウェアで, 我々はこのソフトウェアを介して計算機に対して作業を要求することになります. 実習では, 皆さんがメインで使うことになるシェル「bash」の使い方や機能について 実際に使いながら学んでいきます.

[3-1] 使用シェルを確認する

まずは自分が今どのシェルを使っているかを確認してみましょう. 方法は様々ですが, ここでは echo コマンドを用います.

$ echo $SHELL
/bin/bash

ここで表示された /bin/bash というのがそのユーザのログインシェルになります. 正確には, シェルというソフトウェアもファイルとして扱われているため, ここに書かれているのはそのファイルの格納場所になります.

ログインシェル

ユーザがログインした際に自動的に起動されるシェルです. とくに設定を変えない限り, デフォルトではこのログインシェルがシェルとして 起動されます. chsh コマンドを用いて変更することもできます.

[3-2] bash の各種機能を試す

一口にシェルと言っても, その設計思想や開発時期によって各シェルには 多くの相違点があります. その中で bash は, ユーザが計算機とやりとりをする上で便利になるように 各種の機能を備えています. ここでは, それらの機能を学んでいきましょう.

[3-2-1] ファイル、コマンド名の補完機能

bash には、途中まで打ち込まれた内容を元に、 ファイルやコマンドを補完する機能が備わっています。 具体的には、目的の文字列を何文字か入力し、Tab キーを押します。 複数候補が存在する場合は、Tab キーを2回押すことで、 その一覧を表示させることが出来ます。 この機能は他にも、シェル変数、ユーザー名、ホスト名なども補完してくれます。

$ ls /[Tab]
bin          etc          lost+found  proc         srv     var
boot         home         media       root         sys     vmlinuz
cdrom        initrd.img   mnt         sbin         tmp
dev          lib          opt         selinux      usr     
 
$ ls /h[Tab]
$ ls /home/
<-- [Tab] は Tab キーを押します
--> 「/」以下のファイル
    の候補が表示されます



--> 「/home/」が補完されます

Tab 以外の補完機能
キー操作 意味
Esc ? 補完候補のリストを一覧する。
Esc / ファイル名として補完を行なう。
Esc ! コマンドとして補完を行なう。
Esc Tab 以前に実行したコマンドの補完を試みる。

[3-2-2] ヒストリ機能

bash には便利なヒストリ機能が存在します. この機能によって以前に入力したコマンドを簡単に呼び出すことができます.

$ cat .bashrc
$ 
$ cat .bashrc


<-- 何らかのコマンドを入力してみる.
--> シェルのプロンプト
<-- 「↑」, または Ctrl-p
    (コントロール・キーを押しながら p キーを押す)
    と以前に入力したコマンドを呼び出すことができる.

history コマンドを入力すると今までに入力したコマンドが表示されます. これらの情報は ~/.bash_history に格納されています.

[3-2-3] メタキャラクタ(ワイルドカード)

コマンド入力の際に、 複数のファイル名を「ある規則にしたがってまとめて表す」という試みのために用いられる文字のことを、 "メタキャラクタ"(ワイルドカード)と言います。 メタキャラクタを用いると、タイプする文字数を減らすことができるので、 効率的に入力が行えます。

代表的なメタキャラクタ
メタキャラクタ 意味
* 任意の文字列を表す。
? 任意の1文字を表す。?? は任意の2文字になる。
[ ] [ ] 内に含まれる文字にマッチする。 例えば [a-c]* は abc のいすれかで始まる任意の文字列を表す。
{ } { }内に含まれる文字列にマッチする。 例えば test.{pl,gif,f} は、test.pl test.gif test.f と入力したことになる。

この機能は便利で, * (アスタリスク)は良く使います.

$ mkdir work/
$ cp *.txt work/

$ rm *.txt

<-- カレントディレクトリ内で末尾が .txt という
    ファイルを work 以下に移動させる. 
<-- カレントディレクトリ内で末尾が .txt という
    ファイルを消去する. 

但しいくら便利だからといって以下のコマンドを実行してはいけません. 今は昔, 以下のコマンドで卒論の原稿を半分消してしまった人がいます!

$ rm * 
絶対に禁止!!!

[3-2-4] リダイレクション

cat, echo, date などのコマンドを入力すると, 結果が表示されます. これらの結果をファイルに書き込みたい場合はリダイレクションを 使います.

$ echo "hello world" > hello.txt

$ cat hello.txt
hello world

$ cat hello.txt > world.txt
$ cat world.txt
hello world

$ date >> world.txt
$ cat world.txt
hello world
Sat Oct 26 00:41:30 JST 2002
<-- 「>」が echo "hello world"
    の結果を hello.txt に書き込む.
<-- hello.txt の中身を表示させる
--> 表示

<-- 次にhello.txtの中身をworld.txtにリダイレクト
<-- world.txt の中身を表示させる
--> 表示

<-- 「>>」を使うと上書きされずに追加される.
<-- world.txt の中身を表示させる
--> 表示

[3-2-5] パイプ

上記のリダイレクションでは表示される結果をファイルに書き出しました. これに対し, パイプ「|」を使用すると結果をコマンドに送ることができます.

$ ls -la /dev
           :

$ ls -la /dev | less
           :

$ ls -la /dev | grep "sda" | less

<-- /dev 以下のファイルを表示
--> 大量の情報が表示される

<-- パイプ「|」で結果をコマンド「less」に送る
--> 結果を less で見ることができる. q で終了.

<-- パイプを連続で使うことで複数のコマンドを連結して使うこともできる.
    (「grep」コマンドで "sda" という文字列を含む行のみを抽出し、結果を less で見る)

[3-2-6] エイリアス(別名)機能

あるコマンドに対して、別名をつけたいときに用います。

alias 別名=コマンド名
alias 別名='オプション付きのコマンド名'

お薦め: rm -irm と変更

$ echo "hello world" > hello.txt
$ rm hello.txt

$ echo "hello world" > hello.txt
$ alias rm='rm -i'
$ rm hello.txt
rm: remove regular file `test.txt'?
<-- hello.txt ファイルを作成
<-- hello.txt ファイルを削除

<-- hello.txt ファイルを作成
<-- rm -i を rm として登録
<-- hello.txt ファイルを削除
--> -i オプションをつけなくても削除の確認の問い合わせをしてくれる. y でファイル削除, n で取り消し

[3-2-7] シェル変数

bashは、シェル自身の動作を定義する変数を持っています。 この、シェルが内部で保持している変数を、"シェル変数"と言います。 シェルスクリプトや、コマンドの入力の際に、 値を一時的に格納して後で再利用できるようにするための変数でもあります。 後述の環境変数と違い、シェル以外のプログラムからは参照できません。

基本的に、変数名をつける際は、好きなようにつけて構わないのですが、 環境変数やすでに定義されているシェル変数とは重ならないように指定した方が無難です。

シェル変数に値を代入して, そのシェル変数を表示させて見ましょう.

$ var='Hello!'
$ echo $var
Hello!

$ unset var
$ echo $var

<-- シェル変数 var に Hello! を代入
<-- シェル変数 var を表示
--> シェル変数 var 内の値が表示されます

<-- シェル変数 var を削除

--> なにも表示されません

もう一つの例として, プロンプトの表示を変えてみましょう. プロンプトの表示は, シェル変数"PS1"を用いて設定することが出来ます (\ マークはバックスラッシュに読み替えて下さい).

$ PS1="\u% "

user%

user% PS1="\d$ "
Fri May 7$

Fri May 7$ PS1="\s-\v\$ "
bash-3.2$ 

bash-3.2$ PS1="\u@\h:\w\$ "
user@joho:~$ 
<-- プロンプト表示を"ユーザ名%"にする
    (詳細は以下の表を参照)
--> userは自分のユーザ名

<-- プロンプト表示を"日付%"にする


<-- プロンプト表示を"シェルの名前-バージョン"にする


<-- プロンプト表示を"ユーザ名@ホスト名:作業ディレクトリ"にする


プロンプト表示のコマンド
コマンド 意味
\d 日付
\H ホスト名
\h 最初の"."までのホスト名
\n 改行
\s シェルの名前
\u 現在のユーザ名
\v bash のバージョン
\w 現在の作業ディレクトリ
\! 現在のコマンドのヒストリ番号

[3-2-8] ジョブ制御

ジョブ(Job)とは、ユーザがコンピュータに行なわせる仕事の単位です。

似た意味を持つ言葉に、タスクとプロセスがありますが、 この2つは共にマルチプログラミングの目的で、 コンピュータがCPU(中央演算処理装置)に行わせる仕事の単位です。 ジョブは、複数のジョブステップから構成されることがありますから、 ジョブとタスクは一致するとは限りません。

bash には、1つのシェルで複数のジョブを切替えながら、 並行して作業を行う機能があります。これをジョブ制御と呼びます。

上記2種のジョブを制御するために、 bash には fg, bg, jobs コマンド、そして & が用意されています。

$ xeyes &
$ xclock
^Z
[2]+  Stopped          xclock
<-- xeyes というアプリケーション(ポインタを追いかける目玉)が起動します. 
<-- xclock というアプリケーション(時計)が起動します. 
<-- Ctrl-z を押し, fg ジョブを停止させます. 
--> ジョブ番号[2]の xclock が停止しました

上の例では, 最初に起動した xeyes は末尾に & を付けたため bg ジョブとなり, すぐに次のコマンドを実行できるようになります. そして続いて起動した xclock は特に指定しなかったので fg ジョブとなり, ジョブが終了するまで他のコマンドを受け付けなくなります. xclock は時計を表示しつづける(すなわちジョブが終了しない)ため, 強制的に fg ジョブを停止する Ctrl-z を押すと, xclock が停止するため自由にコマンドを入力できるようになります.

次に jobs と打ち込み、現在このシェルから実行中のジョブ一覧を表示させます。

$ jobs
[1]-  Running          xeyes &
[2]+  Stopped          xclock

--> ジョブ番号[1]の xeyes が実行中です
--> ジョブ番号[2]の xclock が停止中です

xclock より前に xeyes が実行されていたので、上のような表示になります。 [ ]の中の数字はジョブの番号を表します。 +は "current job"、- は"previous job"と呼ばれ、 ジョブの切替え対象となる順番を表しています。

bg コマンドを用いると、 フォアグランドジョブをバックグランドジョブに切り替えることが出来ます。 (bg の後に % ジョブ番号と入力)

$ bg %2
[1]-  Running          xeyes &
[2]+  Running          xclock &

--> ジョブ番号[1]の xeyes が実行中です
--> ジョブ番号[2]の xclock が実行中です

逆に、バックグランドジョブをフォアグランドジョブに切り替えるには、 fg コマンドを用います。(ジョブ番号の指定の仕方は、bg コマンドと同様)

$ fg %1
xeyes

フォアグラウンドジョブは, Ctrl-c(コントロール・キーを押しながら c キーを押す)として、 終了させることもできます. フォアグラウンドジョブが正常終了できなくなった場合等に有効です.

^C
$
<-- Ctrl-c を押します
--> プロンプトが表示され入力可能となります. xeyes は終了します. 

バックグラウンドジョブを終了させるには, kill コマンドを用います.

$ kill %2
[2]+  終了しました       xclock
<--ジョブ番号[2]の xclock に終了シグナルを送る. 

以上が bash の主な機能になります. これらの機能を使いこなせるかどうかがスキルの指標と言えるでしょう. 後述するシェルスクリプトでもこれらの機能が大きな役目を果たすことに なりますので, 必要に応じてしっかり復習してください.

[3-3] 環境変数を設定する

環境変数とは, アプリケーションやコマンドなどの動作を統一的に制御するために 、ユーザーが設定する変数です。

有名な環境変数
環境変数名 意味
USER ユーザ名
HOST ホスト名
LC_ALL
LANG
LANGUAGE
言語環境。日本語ならば ja_JP.UTF-8、英語ならば C。
LC_ALL による言語設定は ほぼ全てのアプリケーションに関して有効である。 LANG, LANGUAGE はアプリケーションに よって有効になる場合とならない場合がある。
PATH コマンドサーチパス
HOME ホームディレクトリ

環境変数には、 あらかじめ使い方が決められたものがあり、 変更には注意が必要です。

例として、以下の4つのコマンドを順番に入力してみてください。

$ export LC_ALL=C
$ man passwd
$ export LC_ALL=ja_JP.UTF-8
$ man passwd
<--言語環境をデフォルト(英語)にする
<--passwd のマニュアルを表示する
<--言語環境を日本語にする
<--passwd のマニュアルを表示する

これを実際に試してみると、 一度目の man passwd と二度目の man passwd で出力される結果が違うのが、 確認できると思います。 環境変数とはこのように、 あらかじめ設定していた文字列によってプログラムの動作を規定する為のものです。

次に以下のコマンドを実行して下さい。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games:
$ date
Fri May  7 14:18:18 JST 2010

$ export PATH=""
$ date
bash: date: command not found
$ /bin/date
Fri May  7 14:18:18 JST 2010

$ export PATH="/usr/local/bin:/usr/bin:/bin:/usr/games:"
$ date
Fri May  7 14:18:18 JST 2010
<-- 環境変数 PATH を表示させます


--> date コマンドで
     現在の時刻が表示されます.
<-- 環境変数 PATH を空にします.

--> date コマンドは無いと言われました. 
<-- date コマンドの絶対パスを指定しました.
--> 現在の時刻が表示されます.
  
<-- 環境変数 PATH の設定を元に戻します.

--> date コマンドで
    現在の時刻が表示されます.

すると最初は存在していたはずの date コマンドが存在しないと言われるでしょう. コマンドもファイルですから本来は絶対パスで書かねばならないのですが, PATH 環境変数にコマンドの置かれているディレクトリを指定しておくと コマンド名そのもので実行できます.



<< 戻る(パーミッション)      次へ >>(テキストエディタ)

[3-4] 付録(シェルの種類やその他の機能など)

シェルの組み込みコマンド

シェルで実行できるコマンドの種類には, 「外部コマンド」,「組み込みコマ ンド」, 「エイリアスで定義されたコマンド」等があります. 「外部コマン ド」は /bin/, /usr/bin/ 以下のディレクトリに個別に格納されており (例: ls, xterm) , 「組み込みコマンド」はシェルのプログラムに直接組み込まれ ています.「組み込みコマンド」には以下のようなものがあります。

echo, set, unset, alias, history, cd, ...

help コマンドを利用すると、これら組み込みコマンドの、簡単な説明を得られます。

コマンドに関するマニュアルは, man というコマンドを用いることで得られます.

起動ファイル, 環境定義ファイル

環境変数やシェル変数, aliasを設定 or 変更しても, そのシェルを終了したりログアウト した場合その設定や変更は消えてしまいます. 一時的な変更ではなく個人で恒常的に環境変数やシェル変数を変更する場合, ホームディレクトリ以下に存在する .bashrc, .bash_profile を編集します. 例えば自分の作成したプログラムやスクリプトの置場にも PATH を通す場合, .bashrc や .bash_profile を編集する必要があるでしょう. この 2 つのファイルの役割は以下のようになっています.

.bashrc と .bash_profile の役割
ファイル名 役割
.bash_profile ログインシェルの設定.
.bashrc ログインシェル以外のシェルの設定

ログインシェルとはユーザがログインした時直後に現れるシェルのことです (情報実験機のログインシェルは bash です.). ターミナル(xterm 等)を起動すると一緒にシェルも起動されますが, そのシェルは .bashrc を読み込んでいます. 2 つ設定ファイルがあって紛らわしいかもしれませんが, 混同しないように しましょう.

.bash_profile,.bashrc 共に「シェルスクリプト」になっています (シェルスクリプトに関しては後述します. ). それらのファイルの中身はコマンドが羅列してあると考えて下さい. ですから ls --color を ls にエイリアスし, LC_ALL 環境変数を日本語に したかったらファイル内に以下の 2 行だけ書いておけば良いです.

$ alias ls='ls --color'
$ export LANG=ja_JP.UTF-8

代表的なシェルの紹介

主要なシェルには以下のようなものがあります。

ここでは bash について説明しましたが, 時間があれば他のシェルも試しに 使ってみましょう.

$ sh
> 
$ ^[[A^[[A^[[D^[[D

$ exit
<-- これが sh に debian が改良を加えた「dash」である.
--> dashのプロンプト (bash とは違うモノが表示されるはず)
<-- ヒストリ機能は使えず, カーソルキー(矢印キー)
    を押してもこんな文字が表示されるだけ.
<-- 元のシェルに戻る.


<< 戻る      次へ >>

最終更新日: 2012/04/19(高橋康人) 全面改稿 Copyright © 2012 inex