Linux講座にようこそ。このページは「Linuxの使い方 - 第5章 より高度なシェルの使い方」です。

Linuxの使い方

5. より高度なシェルの使い方(2/2)

5.5 ユーザ環境の設定

ヒストリ機能やエイリアス機能は作業環境をより快適なものにしますが、環境変数の設定を行うと更に快適になります。また、環境を設定するためのコマンドを自動実行する機能もあります。

5.5.1 環境変数

シェルやアプリケーションソフトの環境を制御するための変数を環境変数と呼んでおり、ユーザが値を変更できるものもあります。ここでは、Bashの環境変数を説明します。(主なもの)

なお、引数無しのenvコマンドで全ての環境変数の内容を表示出来ます。また、特定の環境変数の内容を表示するにはechoコマンドを使用します。

【表5-6】 環境変数一覧
変数名内容
BASHBashコマンドファイルの絶対パス名です。
CDPATHcdコマンドが検索に使用するディレクトリのリストです。標準では未設定ですので、必要に応じて設定します。
IFSコマンドの区切り記号です。
HISTFILE実行したコマンドの登録ファイルの絶対パス名です。標準ではホームディレクトリの下の「.bash_history」です。
HISTSIZE記憶されるコマンドの最大数です。
HOMEホームディレクトリの絶対パス名です。
HOSTNAMEホスト名です。
LANG地域情報です。Fedoraの場合の標準値は「ja_JP.UTF-8」です。
OLDPWD1つ前のカレントディレクトリの絶対パス名です。
PATHコマンドを検索するディレクトリ(検索パス名)のリストです。
PS1プロンプトの内容です。
PWDカレントディレクトリの絶対パス名です。
SHELLシェルコマンドファイルの絶対パス名(BASHと同じ)です。
USERログインユーザ名です。

コマンドやアプリケーションを実行すると、シェルは子供のシェル(サブシェルと呼びます)をつくり出して、サブシェルでコマンドやアプリケーションを実行します。環境変数はサブシェルにも引き継がれますが、親シェルで変更されたものは引き継がれないことがあります。サブシェルに引き継ぎたい場合は、exportコマンドで登録します。環境変数を変更した場合はexportコマンドで登録しておくとよいでしょう。

$ export 環境変数名="値" ← =の前後には空白を入れてはいけません

5.5.2 環境変数の利用と設定

環境変数を参照するときは変数名の前に$(ドル記号)をつけます。

HOME環境変数を使って、ホームディレクトリの下のファイルをコピーします。

$ pwd ← カレントディレクトリを確認します
/home/merry/TMP/TMP1
$ cp $HOME/.bashrc bashrc.bkup ← $HOMEが絶対パス名に置き換わって実行されます
$
$ ll bashrc.bkup ← 確認します(llコマンドはaliasで登録済とします)
-rw-r--r--    1  merry    users    360  4月 28 23:13 bashrc.bkup
$

自作のプログラムを置いてあるディレクトリもコマンドファイルの検索対象にします。

$ cc -o hello.prg hello.c ← 実行可能プログラムファイルをhello.prgとして作成します
$ hello.prg ← hello.prgを実行します
bash: hello.prg: command not found ← プログラムファイルが見つからないというエラーメッセージです
$
$ pwd ← カレントディレクトリを確認します
/home/merry/mybin
$ echo $PATH ← 環境変数PATHの値を確認します
/usr/bin:/bin:/usr/X11R6/bin:/usr/local/bin
$
$ PATH=$PATH:$PWD ← PATHにカレントディレクトリの絶対パス名を追加します
$ echo $PATH ← PATHの値を確認します
/usr/bin:/bin:/usr/X11R6/bin:/usr/local/bin:/home/merry/mybin
$
$ hello.prg ← hello.prgを実行します
Hello!!
Hello!!
Hello!!
Hello!!
Hello!!
$

カレントディレクトリをプロンプトとして表示します。

$ PS1="[\w] " ← \wはカレントディレクトリを意味します
[~] ← ~(チルダ)はホームディレクトリを表します
[~] cd TMP ← カレントディレクトリを変更します
[~/TMP] cd TMP1 ← さらに、カレントディレクトリを変更します
[~/TMP/TMP1]
[~/TMP/TMP1] PS1="$ " ← 元のプロンプトに戻します
$

5.5.3 環境の自動設定

aliasコマンドで登録した内容や環境変数の内容は、ログアウトすると取り消されてしまいます。そこで、次のログイン時にも有効にしたい場合は、再度、設定コマンドを実行することになります。このような無駄を省くために、ログイン時に自動的にコマンドを実行する手段が用意されています。自動実行したいコマンドがある場合は、次に示すユーザ・プロファイルにコマンドを追加しておきます。

ユーザ・プロファイルを変更して、変更内容を有効にするには再度ログインする必要があります。(~/.bashrcの場合は、次のサブシェルから有効になります)

ユーザ・プロファイルはユーザ登録時に作成されるため、通常は作成する必要はありませんが、もし無い場合はホームディレクトリの下にエディタで作成します。また、ファイル名が.(ピリオド)で始まっていますので、lsコマンドで表示する場合は「-a」オプションを指定します。

【表5-8】 ユーザ・プロファイル一覧
ユーザ・
プロファイル名
起動の
タイミング
内容
~/.bash_profileログイン時 システム・プロファイルの/etc/profileの次に実行されます。当ファイルが無い場合は~/.bash_loginを探し、これもない場合は~/.profileを探します。
~/.bashrcBash起動時 bashコマンドの実行、或はviエディタの「:sh」コマンドやシェルスクリプトを実行するとシェルが起動されます。このシェルをサブシェルと呼んでおり、~/.bashrcはサブシェル起動時に実行されます。また、当然のことながら、ログイン時にはBashを起動しますので、ログイン時にも起動されます。
~/.logoutログアウト時標準ではファイルは用意されないようです。必要ならば作成します。

5.5.4 ユーザ・プロファイル例

ユーザ・プロファイルに既に記述されている内容は変更や削除をしないほうがよいでしょう。(少なくとも内容が理解できるまでは)削除する場合は行の先頭に"#"をつけてコメントにしておくと、間違えたときに簡単にもとに戻せます。

.bashrcで環境変数の設定を行います。

$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    /etc/bashrc
fi

# User specific aliases and functions
export PATH=$PATH:$HOME/mybin ← コマンド検索パスに~/mybinを追加します
export PS1='\$ ' ← プロンプトを変更します
$

5.6 プロセスの操作

プロセスとはプログラムの実行環境(CPUやメモリ等のリソースを含む)のことです。プログラム(コマンドやアプリケーション)を起動するとシェルによりサブシェルが作られて、そこで実行します。このサブシェルは1つのプロセスで、親のシェルがカーネルに依頼して作ります。プロセスには、プロセスIDと呼ぶユニークな番号が割り当てられており、プロセスの操作を行う場合に使います。

通常、コマンドはターミナル・エミュレータ上で実行します。コマンドプロンプトが表示されている状態の時にコマンドを指定して実行し、実行が終了したらコマンドプロンプトが表示されますが、この実行方法がフォアグラウンドプロセスです。フォアグラウンドプロセスはひとつひとつのコマンドを順番に直線的に実行することになります。一方、複数のコマンドを並列的に実行するのがバックグラウンドプロセスで、バックグラウンドプロセスにはジョブ番号と呼ぶ番号が割り当てられます。

プロセスの操作として、ここでは次のことについて説明します。

  • プロセスの表示(psコマンド)
  • バックグラウンドプロセスの強制終了(killコマンド)
  • フォアグラウンドプロセスからバックグラウンドプロセス、バックグラウンドプロセスからフォアグラウンドプロセスへの移動(fgコマンド、bgコマンド、jobsコマンド)

5.6.1 形式

プロセスIDはpsコマンドで、ジョブ番号はjobsコマンドで表示することが出来ます。

$ ps -el
$ kill -l
$ kill -シグナル名 %ジョブ番号またはプロセスID
$ fg %ジョブ番号
$ bg %ジョブ番号
$ jobs -l %ジョブ番号

psコマンドは引数を指定しないと、psコマンドを実行したターミナルから起動したプロセスのみを表示します。

【表5-9】 psコマンド・オプション
オプション意味
-eシステムで起動しているプロセスの全てを表示します。(-Aも同じです)
-l詳細情報を表示します。
【表5-10】 killコマンド・オプション
オプション意味
-lシグナルの一覧を表示します。
-シグナル名プロセスに送るシグナルを指定します。省略した場合はSIGTERMシグナルを送り、プロセスを強制終了させます。
%ジョブ番号シグナルを送るプロセスのジョブ番号を指定します。ジョブ番号はバックグラウンドプロセスに付けられた番号です。
プロセスIDシグナルを送るプロセスのIDを指定します。プロセスIDは全てのプロセスに付けられた番号です。

fgコマンドは引数を指定しないと、一番最近起動したバックグラウンドプロセスを対象にします。

【表5-11】 fgコマンド・オプション
オプション意味
%ジョブ番号ジョブ番号で指定したバックグラウンドプロセスをフォアグラウンドプロセスに移動します。

bgコマンドは引数を指定しないと、サスペンド(停止中)プロセスをバックグラウンドプロセスに移動します。

【表5-12】 bgコマンド・オプション
オプション意味
%ジョブ番号ジョブ番号で指定したサスペンド(停止中)プロセスをバックグラウンドプロセスに移動します。

jobsコマンドは引数を指定しないと、現在起動中のバックグラウンドプロセスを全て表示します。

【表5-13】 jobsマンド・オプション
オプション意味
-lプロセスIDも表示します。
%ジョブ番号指定したバックグラウンドプロセスのみを表示します。

5.6.2 実行例

ここで実行するxclockは時計、xeyesはマウスポインターを見ているアプリケーションで、X Windowシステムの標準的なアプリケーションです。(xclockとxeyesが実行できない場合は「2.4 その他の知っておくと便利な機能」の補足をご覧ください)

xclockとxeyesをバックグラウンドプロセスで実行します。

$ xclock & xeyes & ← バックグラウンドプロセスで実行します
[1] 1172 ← [1]がジョブ番号で1172がプロセスIDです
[2] 1173
$ ← ジョブ番号とプロセスIDを表示後、すぐにプロンプトが表示されます
$ ps ← プロセスを表示します
PID   TTY        TIME  CMD ← PID欄がプロセスIDです
1012  pts/1  00:00:00  bash
1172  pts/1  00:00:00  xclock
1173  pts/1  00:00:00  xeyes
1177  pts/1  00:00:00  ps
$
$ jobs ← ジョブ番号を調べます
[1]- Running    xclock &
[2]+ Running    xeyes &
$
$ kill 1172 ← プロセスIDが1172のxclockを強制終了します
$ ps ← 確認します
PID   TTY        TIME  CMD
1012  pts/1  00:00:00  bash
1173  pts/1  00:00:00  xeyes
1177  pts/1  00:00:00  ps
[1]- 終了しました     xclock ← 終了後、最初のコマンド実行後に表示します
$
$ fg %2 ← ジョブ番号2のxeyesをフォアグラウンドプロセスに移動します
xcalc
 ← フォアグラウンドプロセスが実行中なのでプロンプトは出て来ません。
    Ctrl+Z(サスペンド)を入力するとフォアグラウンドプロセスが一時停止します
[2]+ Stopped     xeyes
$ bg ← プロンプトが出て来るので、停止中のプロセスをバックグラウンドプロセスとして再開します
[2]+ xeyes &
$