Linux講座にようこそ。このページは「Linuxの使い方 - 第5章 より高度なシェルの使い方」です。
ヒストリ機能やエイリアス機能は作業環境をより快適なものにしますが、環境変数の設定を行うと更に快適になります。また、環境を設定するためのコマンドを自動実行する機能もあります。
シェルやアプリケーションソフトの環境を制御するための変数を環境変数と呼んでおり、ユーザが値を変更できるものもあります。ここでは、Bashの環境変数を説明します。(主なもの)
なお、引数無しのenvコマンドで全ての環境変数の内容を表示出来ます。また、特定の環境変数の内容を表示するにはechoコマンドを使用します。
変数名 | 内容 |
---|---|
BASH | Bashコマンドファイルの絶対パス名です。 |
CDPATH | cdコマンドが検索に使用するディレクトリのリストです。標準では未設定ですので、必要に応じて設定します。 |
IFS | コマンドの区切り記号です。 |
HISTFILE | 実行したコマンドの登録ファイルの絶対パス名です。標準ではホームディレクトリの下の「.bash_history」です。 |
HISTSIZE | 記憶されるコマンドの最大数です。 |
HOME | ホームディレクトリの絶対パス名です。 |
HOSTNAME | ホスト名です。 |
LANG | 地域情報です。Fedoraの場合の標準値は「ja_JP.UTF-8」です。 |
OLDPWD | 1つ前のカレントディレクトリの絶対パス名です。 |
PATH | コマンドを検索するディレクトリ(検索パス名)のリストです。 |
PS1 | プロンプトの内容です。 |
PWD | カレントディレクトリの絶対パス名です。 |
SHELL | シェルコマンドファイルの絶対パス名(BASHと同じ)です。 |
USER | ログインユーザ名です。 |
コマンドやアプリケーションを実行すると、シェルは子供のシェル(サブシェルと呼びます)をつくり出して、サブシェルでコマンドやアプリケーションを実行します。環境変数はサブシェルにも引き継がれますが、親シェルで変更されたものは引き継がれないことがあります。サブシェルに引き継ぎたい場合は、exportコマンドで登録します。環境変数を変更した場合はexportコマンドで登録しておくとよいでしょう。
環境変数を参照するときは変数名の前に$(ドル記号)をつけます。
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="$ " ← 元のプロンプトに戻します $
aliasコマンドで登録した内容や環境変数の内容は、ログアウトすると取り消されてしまいます。そこで、次のログイン時にも有効にしたい場合は、再度、設定コマンドを実行することになります。このような無駄を省くために、ログイン時に自動的にコマンドを実行する手段が用意されています。自動実行したいコマンドがある場合は、次に示すユーザ・プロファイルにコマンドを追加しておきます。
ユーザ・プロファイルを変更して、変更内容を有効にするには再度ログインする必要があります。(~/.bashrcの場合は、次のサブシェルから有効になります)
ユーザ・プロファイルはユーザ登録時に作成されるため、通常は作成する必要はありませんが、もし無い場合はホームディレクトリの下にエディタで作成します。また、ファイル名が.
(ピリオド)で始まっていますので、lsコマンドで表示する場合は「-a」オプションを指定します。
ユーザ・ プロファイル名 | 起動の タイミング | 内容 |
---|---|---|
~/.bash_profile | ログイン時 | システム・プロファイルの/etc/profileの次に実行されます。当ファイルが無い場合は~/.bash_loginを探し、これもない場合は~/.profileを探します。 |
~/.bashrc | Bash起動時 | bashコマンドの実行、或はviエディタの「:sh」コマンドやシェルスクリプトを実行するとシェルが起動されます。このシェルをサブシェルと呼んでおり、~/.bashrcはサブシェル起動時に実行されます。また、当然のことながら、ログイン時にはBashを起動しますので、ログイン時にも起動されます。 |
~/.logout | ログアウト時 | 標準ではファイルは用意されないようです。必要ならば作成します。 |
ユーザ・プロファイルに既に記述されている内容は変更や削除をしないほうがよいでしょう。(少なくとも内容が理解できるまでは)削除する場合は行の先頭に"#"をつけてコメントにしておくと、間違えたときに簡単にもとに戻せます。
.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='\$ ' ← プロンプトを変更します $
プロセスとはプログラムの実行環境(CPUやメモリ等のリソースを含む)のことです。プログラム(コマンドやアプリケーション)を起動するとシェルによりサブシェルが作られて、そこで実行します。このサブシェルは1つのプロセスで、親のシェルがカーネルに依頼して作ります。プロセスには、プロセスIDと呼ぶユニークな番号が割り当てられており、プロセスの操作を行う場合に使います。
通常、コマンドはターミナル・エミュレータ上で実行します。コマンドプロンプトが表示されている状態の時にコマンドを指定して実行し、実行が終了したらコマンドプロンプトが表示されますが、この実行方法がフォアグラウンドプロセスです。フォアグラウンドプロセスはひとつひとつのコマンドを順番に直線的に実行することになります。一方、複数のコマンドを並列的に実行するのがバックグラウンドプロセスで、バックグラウンドプロセスにはジョブ番号と呼ぶ番号が割り当てられます。
プロセスの操作として、ここでは次のことについて説明します。
プロセスIDはpsコマンドで、ジョブ番号はjobsコマンドで表示することが出来ます。
psコマンドは引数を指定しないと、psコマンドを実行したターミナルから起動したプロセスのみを表示します。
オプション | 意味 |
---|---|
-e | システムで起動しているプロセスの全てを表示します。(-Aも同じです) |
-l | 詳細情報を表示します。 |
オプション | 意味 |
---|---|
-l | シグナルの一覧を表示します。 |
-シグナル名 | プロセスに送るシグナルを指定します。省略した場合はSIGTERMシグナルを送り、プロセスを強制終了させます。 |
%ジョブ番号 | シグナルを送るプロセスのジョブ番号を指定します。ジョブ番号はバックグラウンドプロセスに付けられた番号です。 |
プロセスID | シグナルを送るプロセスのIDを指定します。プロセスIDは全てのプロセスに付けられた番号です。 |
fgコマンドは引数を指定しないと、一番最近起動したバックグラウンドプロセスを対象にします。
オプション | 意味 |
---|---|
%ジョブ番号 | ジョブ番号で指定したバックグラウンドプロセスをフォアグラウンドプロセスに移動します。 |
bgコマンドは引数を指定しないと、サスペンド(停止中)プロセスをバックグラウンドプロセスに移動します。
オプション | 意味 |
---|---|
%ジョブ番号 | ジョブ番号で指定したサスペンド(停止中)プロセスをバックグラウンドプロセスに移動します。 |
jobsコマンドは引数を指定しないと、現在起動中のバックグラウンドプロセスを全て表示します。
オプション | 意味 |
---|---|
-l | プロセスIDも表示します。 |
%ジョブ番号 | 指定したバックグラウンドプロセスのみを表示します。 |
ここで実行する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 & $