Technical Knowledge
sh/bash
[アプリケーション]
作業ディレクトリの保存・移動。
pushd で保存し、popd で保存した場所に戻る。
# pushd ./ # cd ../../ # popd
文字列操作。
文字列演算子 | 処理 |
---|---|
${変数:-デフォルト} | 変数がなければデフォルトを返す |
${変数:=デフォルト} | 変数がなければデフォルトを設定する |
パターン照合演算子 | 処理 |
---|---|
${変数#パターン} | 変数値にパターンがあれば最初の最短パターンより後を返す。 |
${変数##パターン} | 変数値にパターンがあれば最後の最長パターンより後を返す。 |
${変数%パターン} | 変数値にパターンがあれば最初の最短パターンより前を返す。 |
${変数%%パターン} | 変数値にパターンがあれば最後の最長パターンより前を返す。 |
${変数/パターン/文字列} | 変数値にパターンがあれば最初の最長パターンを文字列に置換する。 |
${変数//パターン/文字列} | 変数値にパターンがあればすべての最長パターンを文字列に置換する。 |
ex.) filepath=/opt/sample/conf/AAA.conf.template に対するパターン照合
# filepath=/opt/sample/conf/AAA.conf.template # echo ${filepath} /opt/sample/conf/AAA.conf.template # echo ${filepath#/*/} sample/conf/AAA.conf.template # echo ${filepath##/*/} AAA.conf.template # echo ${filepath%.*} /opt/sample/conf/AAA.conf # echo ${filepath%%.*} /opt/sample/conf/AAA
設定ファイル。
設定ファイルの読み込み。
- ログイン時
- /etc/profile を読み込む。
- ~/.bash_profile が存在すれば読み込む。
- ~/.bash_profile が存在せず ~/.bash_login があればそれを読み込む。
- ~/.bash_profile も ~/.bash_login も存在しない場合は、~/.profile を読み込む。
- bash が別のシェルから読み込まれた場合
- ~/.bashrc のみ読み込まれる。
ログインシェル。
ユーザーがログインした際に起動されるシェルのこと。 ユーザーがログインすると、/etc/passwd ファイルに設定されているシェルが起動する。このシェルが「ログインシェル」。
~/.bash_profile
bash がログインシェルとして起動されたときに1回だけ参照される設定ファイル。
~/.bash_login
bash がログインシェルとして起動されたときに1回だけ参照される設定ファイル。 元は bash より起源が古いCシェル(csh)では .login ファイルが由来の設定ファイル。 csh では .login ファイルがログイン時に1回だけ読み込まれる。 これと同じ機能を bash で実現したもの。ただし bash では、上の .bash_profile の方が先に読み込まれる。 「~/.bash_profile がない」場合、~/.bash_login があればその内容が読み込まれる。
~/.profile
bash がログインシェルとして起動されたときに1回だけ参照される設定ファイル。 「~/.bash_loginがない」場合、この ~/.profile があればその内容が読み込まれる。
~/.bashrc
ユーザーがログインした後で、新たにシェル(bash)を起動したときに読み込まれる設定ファイル。
~/.bash_profile と ~/.bashrc に書き込む内容の区別。
通常の処理で必要な設定を書き込むファイルは、「~/.bash_profile」、「~/.bashrc」の2つで十分である。 これは、~/.bash_profile はログインシェルが起動時に真っ先に読み込まれるファイルなので、これを作成しておけば確実に設定が読み込まれること。また ~/.bashrc については、再度シェルを立ち上げるたびに処理のために必要な環境変数や設定を読み込ませるためである。
- ~/.bash_profile
- コマンド検索パスの設定(PATH変数)。 環境変数は別のシェルを子プロセスとして立ち上げた場合も引き継がれる。
- ~/.bashrc
- エイリアス(別名)の設定。 これは 「alias ls='ls -l'」のようにコマンド文字列に別名をつける設定。
- コマンドプロンプトの表示設定(PS1変数)。
- シェル起動時に上書きされる環境変数等。
while read によるファイルの読み込み時の変数。
while read でファイルを読み込み中に変数を操作する場合、while 内での変数の変更が while 外で反映されない場合がある。
パイプを使ったファイルの読み込み。
1: FLG=0; 2: cat $0 | while read line; do 3: FLG=1; 4: done 5: echo ${FLG}
0
2 行目でパイプを使っているため、while 内は別プロセスとなり変更は反映されず、5 行目で 0 が出力される。
標準入力に一旦書き込み読み込む。
1: FLG=0; 2: exec < $0 3: while read line; do 4: FLG=1; 5: done 6: echo ${FLG}
1
2 行目で exec を使いファイルの中身を標準入力 0 へ書き込み、read で読み込むため変更は反映され、6 行目で 1 が出力される。
別のファイルディスクリプタに書き込んだあと、標準入力に流して読み込む。
1: FLG=0; 2: exec 3< $0 3: while read line 0<&3; do 4: FLG=1; 5: done 6: exec 3>&- 7: echo ${FLG}
1
exec < $0 で直接書きこむと、標準入力がブロックされ画面からの入力ができなくなる(らしい)。 2 行目で一度ファイルの中身を FD3 へ書き込み、読み込み時に、FD3 を標準入力に向けて読み込む。 6 行目では、FD3 をクローズしている。@<br /> 標準入力が奪われてうまく動かないサンプルが分からない・・・