bash –version
bash
コマンドには--verison
というオプションでバージョンを見る機能があるので、
$ bash --version
GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
とすると呼び出したbash
のバージョンが見れます。
が、これは現在動かしているログインシェルと一緒とは限りません。
これだとBash 5.2.15を使ってるので、Bash 5から導入されたBASH_ARGV0
という変数があり、通常はbash
が入っているはずですが、
$ if [[ -v BASH_ARGV0 ]];then echo ok;else echo non;fi
non
となって変数が定義されてません。
この環境では
- ログインシェルは/bin/bash
- このbashのバージョンは4.4.20
- PATHが/home/linuxbrew/.linuxbrew/bin/:…/bin:…のように/binより先に来るものがあり、その中に別途インストールした
bash
があり、それが5.2.15のもの
となっています。
特定のシェルでログインしても、bash
単体で呼ばれるものはPATHの優先度が高いものになるため別のものになります。
したがってbash --version
での確認はシステムにbashが1つしかない場合以外は安全にチェックできないものになります。
シェル変数を確認する
基本的には
$ echo $BASH_VERSION
4.4.20(1)-release
で、シェル変数のBASH_VERSION
を確認するのが一番簡単です。
ただ、一応ただの変数なのであとから変更しようと思えば変更できるので、 なんらかありえる場合はなるべく.bashrcとかには変更するようなことがないことを確認した上でログイン直後に見てみる必要があるかもしれません。
基本的にはBASH_VERSION
を書き換えることなんてめったに無いとは思いますが。
SHELLを確認してそれのバージョンを見る
$ echo $SHELL
/bin/bash
のようにSHELL
という変数を使うとログインシェルに設定されたシェルへのパスが見れます。
これで、
$ /bin/bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
...
とバージョンを確認できます。
ただし、この確認方法はログインシェルに限ったものになります。
新たに別にシェルを立ち上げた場合にはこの変数は書き換えられません。
ログインシェルが/bin/bashで、別のバージョンのbashをHomebrewでインストールしてそれがPATHの上位にある場合:
$ echo $BASH_VERSION
4.4.20(1)-release
$ echo $SHELL
/bin/bash
$ /bin/bash --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
...
$ which bash
/home/linuxbrew/.linuxbrew/bin/bash
$ /home/linuxbrew/.linuxbrew/bin/bash --version
GNU bash, version 5.2.15(1)-release (x86_64-pc-linux-gnu)
...
$ bash
$ echo $BASH_VERSION
5.2.15(1)-release
$ echo $SHELL
/bin/bash
$
な感じで、BASH_VERSION
の方はバージョンが上書きされていますが
SHELL
の方はそのままです。
このままexit
してもとのシェルに戻ると、BASH_VERSION
は正しく戻り、SHELL
はやはりそのままです。
なのでログインシェルのチェックにはSHELL
は使えますが、
今実際に走らせているシェルがなんなのか、という場合にはずれる可能性があります。
$0
bashを起動すると$0
にその起動したbashが入ります。(Bash 5ならBASH_ARGV0
と同じ。)
$ echo $0
/bin/bash
$ bash
bash
$ /home/linuxbrew/.linuxbrew/bin/bash
/home/linuxbrew/.linuxbrew/bin/bash
といった感じに実際に呼び出されたときのパスが入ります。
これであれば今現在のシェルを確認してそのバージョンをきちんと確認できます。
$ $0 --version
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
...
psで調べる
$$
に現在実行中のシェルのプロセスIDが入っているので、
$ ps -ef |grep $$|grep -vE "grep|ps"
usser 12345 67890 0 01:23 pts/3 00:00:00 /bin/bash
みたいな感じで実行しているものを調べることもできます。
ここでは$$
は121345になります。
ただ、例えば$$
に入っている数字が小さくて3とかだとすると、他の部分にも引っかかってしまうので色々と処理を追加しないとうまくいかない可能性もあってちょっと面倒です。
ただ、シェルスクリプト内、とかになってくると上の$0
が使えない(スクリプトファイル名になってしまう)のでこちらを使わざるをえません。
ログインシェルを確認する
ログインシェルであれば直接調べることもできます。
Linux系であれば
$ grep "^$USER:" /etc/passwd
user:x:1000:1000:,,,:/home/user:/bin/bashrc
macOSなら
$ dscl localhost -read Local/Default/Users/$USER UserShell
UserShell: /bin/bash
まとめ
現在動かしているBashのバージョンを確認するには
bash -version
は駄目BASH_VERSION
を確認するのは簡単で確実性が高い- ただし手動で書き換えることも一応可能なので違うこともゼロではない
- 確実に調べるのであれば
$0 --version
という感じ。
Bash以外のものも調べたいのであればやはり$0
を使うのが一番汎用性があります。
別途、シェルスクリプト内で知りたいのであれば
ps
と$$
を使う