📝

ファイルを実行しているshellの種類を正しく判定する

2023/08/29に公開

https://qiita.com/items/f9361e5ff748dea31705


お詫び

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があるよ、という灯台下暗し。

GitHubで編集を提案

Discussion