📝
ファイルを実行しているshellの種類を正しく判定する
お詫び
Qiitaの元記事にて、区切り線を「---」で書いている場所があり、これがZennの記法に干渉して一部うまく表示できない記事がある事を認識しています。
全ての記事を精査しきれていないため、お手数ですがお見かけの際は教えていただけると大変喜びます。
ドヤ記事にすれば、もっといい方法をドヤってくれるshell芸達者が現れるはず!というきたない根性で書き残します。
やりたいこと
ubuntu(デフォルトがbash)でsh test.sh
を実施した時にsh
で実施された事を検知したい。
同様に、zsh test.sh
と実施した場合はzsh
を得たい。
結論
#!/bin/sh
ps h -p $$ -o comm # 期待する結果を得られる
# echo ${SHELL##*/} # 検証用:何をやってもbashが返ってくる
実行時に
-
sh test.sh
# sh -
bash test.sh
# bash -
zsh test.sh
# zsh
を取得できる。
psコマンドのオプションについて
-
h
: ヘッダーを非表示 -
-p
: 対象をPIDで指定 -
$$
: sh実行中のPID -
-o
: 抽出。COMMANDはcomm(ここの情報が見つからなかった)
$SHELL
について
$SHELLで得られる結果はターミナルでログイン中のシェル(親シェル)であるため、shファイル内に互換性のない書き方をしている場合は何らかのフォローを検討するのが親切。
chsh $(which zsh)
などで親シェル自体を変えてしまう方法もあるが、一つのスクリプトを実行するためだけにいちいち変更するのも手間がかかる。
反省(後記)
最初からman ps
を読めばこんなにハマらなかった。
ps --help
が使えないので諦めていたが、helpがダメならmanがあるよ、という灯台下暗し。
Discussion