わたしの名はフレイ 作家・デザイナー見習い
神々とともに生きる詩人 一等星シリウスの導きを信じて

Bash

シェルとは

シェルは、ユーザーのライン入力を受け取って、任意のコマンドプログラムを実行するプログラム。ユーザーが思い通りにさまざまなコマンドのプログラムを実行できるようにした、人間であるユーザーと機械とのインターフェース。

GNU/Linuxで一般的なBashには、コマンドやパスの補完、ヒストリ機能(一度実行したコマンドを履歴から探索できる)、マルチタスクの機能(&を使ったプログラムの非同期の実行やjobsコマンドなど)、コマンドの別名を作れるエイリアス、(厳密にはシェルではなくOSの機能だが)コマンドとコマンドを繋げるパイプの実行、シェルスクリプトの実行などの便利な機能が備わっている。ライバルはFreeBSDなどで一般的なcsh/tcsh(Cシェル系のシェル。シェルスクリプトなどの記法がC言語に近い)。

PATH

Bashなどのコマンドラインシェルは、基本的にユーザーの入力を受け取ってコマンドを実行するが、このコマンドは環境変数であるPATHのディレクトリの中から検索される。

PATHに含まれていないコマンドや実行ファイルでも、/sbin/serviceのようにフルパスで指定するか、./configureのように相対パスで指定すれば実行できる。

また、ユーザーのホームディレクトリを得るHOMEという環境変数もある。Bashでは、ホームディレクトリを~(チルダ)で表現し、ホームディレクトリの中にある.bashrcは~/.bashrcと記述してシェルからアクセスできる。

一般ユーザーとrootユーザーのシェル

シェルには、一般ユーザーのシェルとrootユーザーのシェルという二種類のシェルがある。慣習的に、コマンドの入力例などを記述する際に、一般ユーザーのシェルは$、rootユーザーのシェルは#を行頭につけて表現する。この$や#を入力する必要はない。

UNIXでは、誤った操作によるシステムの破壊を防ぐために、通常はシステムの変更・破壊権限を持たない一般ユーザーとしてログインし、一般ユーザーのシェルを起動させて操作する。データはホームディレクトリのような場所に保存し、多くの操作は一般ユーザーで行う。

だが、ソフトウェアパッケージのインストール・アンインストールや、システムの定期的な更新など、一部の操作はrootユーザーになった上で行う必要がある。

この時は、su -コマンドを使うことで、rootユーザーのシェルを起動できる。

初期化スクリプト

特に、PATHの永続的な設定をしたい場合など、ログイン時に特定のコマンドを実行したい場合、起動スクリプトに記述することができる。

たとえば、上のPATHの設定の例では、そのコマンドを実行した時にしかPATHが設定されず、シェルを終了してしまうと次回のシェルでまた手動で実行しないといけない。このような時に初期化スクリプトを使う。

初期化スクリプトはホームディレクトリにある.bash_profile(ログイン時)と.bashrc(シェルの毎回起動時)などがある。

だが、これはコマンドシェルとしてログインした場合であり、Xサーバーでグラフィカルなディスプレイマネージャ(GNOMEならGDMなど)でログインした時には実行されない。

Xサーバーを実行した時にコマンドを実行したい場合は、.xsession(Xログイン時)や.xinitrc(startxコマンドでXサーバーを手動で起動する時)などにコマンドを記述する。.xinitrcは、たとえばtwmではなく独自のウィンドウマネージャを起動したい場合などにその起動コマンドを記述すると、startxを実行した時に自動でウィンドウマネージャを起動できて便利である。日本語入力のためのインプットエンジンの設定も.xinitrcに記述することが多い。(最近のiBusなどの新しい世代のインプットエンジンでは、.xinitrcを編集する必要はなく、GUIで設定できる。)

コマンドの強制終了とエラー

コマンドを実行している時に、途中で実行を中止し、強制終了したい時はCtrl+Cを実行する。

また、プログラムを実行して、何も出力せずにプログラムが終了し、元のシェルの入力に戻った時は、コマンドは正常に処理を完了している。何かエラーを出した時(途中で不正終了した時)はエラーが表示される。

作業の終了

別のユーザーとしてログインしたい場合など、シェルそのものを終了させたい時はexitコマンドを実行する。また、システムを終了させたい時はshutdownコマンドを実行する。システムの終了は-h、再起動は-r。

# shutdown -h now

補完(Tabキー)

ファイルのパスを入力している時に、途中まで入力してTabキーを押すと、それ以降の入力(決まっているところまで)を自動補完してくれます。

候補がたくさんある時はリスト表示されます。

ヒストリ(↑、↓)

↑キーと↓キーを押すことで、一度入力したことのあるコマンド行を再度表示し、再実行することが出来ます。

ヒストリは.bash_historyに記録されます。

ヒストリは、Ctrl+r(後方)とCtrl+s(前方)でインクリメンタルサーチをすることが出来ます。

エイリアス

コマンドに常にオプションを付けたい時は、エイリアスが使えます。

$ alias rm='rm -i'

aliasコマンドを引数を付けずに実行することで、定義済みのエイリアス一覧を見ることが出来ます。

$ alias

複数行に渡るコマンド(\)

行末に\を付けることで、コマンドを複数行にわたって記述出来ます。

パイプとリダイレクト(| < > >>)

パイプは、プログラムが出力した内容を別のプログラムに入力として再度渡す機能。上手く使うことで、たくさんの処理をひとつのテキストデータ(ストリーム)に対して複数行うことができる。また、リダイレクトはストリームとファイル入出力を変換する機能。読み込み、書き込み、追記が存在する。

言ってしまえば、オブジェクト指向の「.」と同じような考え方である。UNIXのコマンドは、多くがこのパイプによって使われることを意図して設計されている。

リダイレクト

リダイレクトは、<は読み込み、>は書き込み、>>は追記です。

リダイレクトの例1:

$ echo hello > test_hello.txt
$ echo hello2 >> test_hello.txt
$ cat test_hello.txt
hello
hello2

リダイレクトの例2:

$ patch -u < test.patch

その他にも、既にファイルが存在しても書く場合、エラー出力も取る場合などがあり、またCシェルとBシェルでも違う。以下のようなページを参照のこと。

普通のリダイレクトでは、標準出力しかリダイレクトされず、標準エラー出力は無視される。標準エラー出力もリダイレクトしたい場合は「&> all.txt」などとする。また、標準出力を1>、標準エラー出力を2>と分けて使うこともできる。(Windowsコマンドプロンプトも同様に1>と2>で標準出力と標準エラー出力を区別できる。)

標準エラー出力を除外

標準エラー出力を除外したい場合は、「2> /dev/null」のようにリダイレクトする。このようにした場合、標準エラー出力はどこにも表示されず、保存もされない。

パイプ

パイプを使うことで、あるコマンドの結果を別のコマンドに渡すことができる。

$ find / | grep 2018

標準エラー出力も合わせてパイプに渡したい場合は、「|& more」などとする。

コマンドの同時実行(; && ||)

;を使うことで、複数のコマンドを同時に実行出来ます。また、&&や||を使うことで、コマンドが正常に終了した場合、異常に終了した場合に次のコマンドを実行出来ます。

チルダ展開 (~)

チルダ(~)はホームディレクトリを指す。

cd ~

「cd ~」とすることでホームディレクトリに移動できるほか、ホームディレクトリ内のディレクトリやファイルを「vi ~/.emacs」などと表すことができる。

変数展開 ($)

変数を使うことで、シェルスクリプトなどが綺麗に書けることがある。

$変数名

または

${変数名}

のように使う。

コマンド置換 (``)

コマンド名をそのコマンドを実行した出力で置き換えられる。

$(コマンド)

または

`コマンド`

のように使う。

シェル変数とset

シェル変数の一覧を見るためには、setコマンドを使う。

$ set
BASH=/bin/bash
~略~

シェル変数の設定は以下のように行う。

$ HOGE=hoge

環境変数とenv/export

環境変数の一覧を見るためには、envコマンドを使う。

$ env
PWD=/home
~略~

環境変数を設定するためには、一度シェル変数を設定して、exportする。

$ env | grep HOGE
$ HOGE=hoge
$ export HOGE
$ env | grep HOGE
HOGE=hoge

シェル変数は、シェルから起動したプロセスに値が引き継がれない。シェル変数はシェル固有の値を、環境変数は言語などグローバルな値を持たせる。

sourceコマンド

sourceコマンドは、ファイルに書かれたコマンドを現在のシェルで実行する。シェルの設定を反映させるために使う。

source .bashrc

フォアグラウンドで実行

コマンドをフォアグラウンドで実行する時は、単にコマンドを実行します。

バックグラウンドで実行(&)

コマンドの最後に&を付けると、バックグランドで並列的にコマンドを実行出来ます。

$ cp /home/hoge/test1 /home/hoge/test2 &

&をつけたバックグラウンド実行はとても良く使うので覚えておきましょう。特に、GUIアプリケーションをコマンドラインから実行したりする時に良く使います。サーバーデーモンも&と同じ仕組みで動いています。

基本的に、コマンドをマルチタスクで実行したい時は、なんでもコマンド行の最後に&をつければ並列で実行される。特にXのターミナルからGUIアプリケーションを実行する時、&をつけずに実行すると、ターミナルエミュレータのウィンドウを閉じた時にGUIアプリケーションも一緒に終了してしまう。必ず「firefox &」のように最後に&をつけて並列で実行させるようにしよう。

ジョブ制御のコマンド一覧

コマンド 説明
Ctrl+z コマンドの一時停止。
Ctrl+c フォアグランドで実行中のプロセスを強制終了する。
jobs 一時停止中・バックグラウンドで実行中のコマンドの一覧。
bg 一時停止中のコマンドをバックグラウンドに移す。
fg 一時停止中・バックグラウンドで実行中のコマンドをフォアグラウンドに持ってくる。
ps 実行中のプロセス一覧。
kill バックグラウンドで実行中のプロセスを強制終了する。

Readline

Readlineは、Bashで使われているコマンドライン入力用のライブラリ。さまざまなショートカットがあり、履歴の管理やコマンド行補完などもReadlineによって行われている。

NetBSDのeditlineというライブラリもある。

端末エミュレータ

GNOME端末やKonsoleを使うことで、GUIから端末エミュレータとしてシェルを実行出来ます。

Cシェルとは

Cシェルは、ビル・ジョイによって作られたもう一つのUNIX標準コマンドラインシェル。

BashなどのBシェル(Borneシェル)に比べて、シェルスクリプトの記法や文法がC言語に近い。