rcmdnk's blog

入門bash 第3版

Bashがいくつかインストールされている環境で ログインシェルとして使っているBashがなんなのか、 何も考えないで確認しようとすると間違える事もあるので注意が必要という話。

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$$を使う
Sponsored Links
Sponsored Links

« GitHub ActionsでのGistへのアクセス制限の回避 シェルスクリプト(主にBash)で文字列前後のスペースを削除する »

}