1. ホーム
  2. bash

[解決済み] 現在作業しているシェルを判断する方法

2022-03-14 17:57:41

質問

現在作業しているシェルを判断するにはどうすればよいですか?

の出力は ps コマンドだけで十分なのでしょうか?

Unixの異なるフレーバーでこれを行うにはどうしたらよいでしょうか?

どのように解決するのですか?

  • を見つけるには、3つのアプローチがあります。 名前 現在のシェルの実行ファイルの

    この3つのアプローチはすべて、シェルの実行ファイルが /bin/sh をリネームしたもので、実際には bash などと言われることがあります(よくあることです)。

    したがって、2つ目の質問である ps という答えが返ってきます。 常に "です。

    1. echo $0 - は、プログラム名...シェルの場合は実際のシェルを表示します。

    2. ps -ef | grep $$ | grep -v grep - とすると、実行中のプロセスの一覧から現在のプロセス ID を探します。現在のプロセスはシェルであるため、シェルが含まれることになります。

      これは100%信頼できるものではありません。 その他 プロセスで ps のリストにはシェルのプロセス ID と同じ数字が含まれており、特にその ID が小さな数字である場合 (例えばシェルの PID が "5" である場合、 "java5" や "perl5" というプロセスが同じ grep を出力してください!)。 これは、シェル名に依存できないことに加えて、"ps"アプローチの2つ目の問題点です。

    3. echo $SHELL - 現在のシェルへのパスは SHELL 変数を使用します。これの注意点は、サブプロセスとして明示的にシェルを起動した場合(例えば、ログインシェルでない場合)、代わりにログインシェルの値を取得することです。もしその可能性があるのなら ps または $0 のアプローチになります。


  • しかし、実行ファイルが実際のシェルと一致しない場合(例. /bin/sh は実際にはbashかkshです)、ヒューリスティックが必要です。ここでは、様々なシェルに固有の環境変数を紹介します。

    • $version はtcshに設定されています

    • $BASH はbashに設定されています。

    • $shell (小文字)はcshまたはtcshの実際のシェル名に設定されます。

    • $ZSH_NAME はzshに設定されています

    • kshは $PS3$PS4 が設定されているのに対し、通常のBourneシェル( sh ) のみです。 $PS1$PS2 のセットです。これは一般的に最も区別がつきにくいように思われます。 のみ との環境変数のセット全体の違い shksh Solaris boxenにインストールしているのは $ERRNO , $FCEDIT , $LINENO , $PPID , $PS3 , $PS4 , $RANDOM , $SECONDS および $TMOUT .