ターミナルで使用しているシェルをテストするにはどうすればよいですか?


69

ターミナルで使用しているシェルを確認するにはどうすればよいですか?MacOSで使用しているシェルは何ですか?


2
@xenoterracide:少なくともunix.stackexchange.com/questions/3645/…。geekosaurの答えはより完全であるため、以前の質問を終了することに投票しました。
ジル

1
エコー$シェル、いや?
罪のない世界

@ innocent-worldいいえ、そうでecho #SHELLはありません。geekosaurによる回答の#3を参照してください。
バジルブルク

「シェル」が明確に定義された意味を持っているかどうかはわかりません。たとえば、あなたは走るかもしれませんがxterm -e /bin/cat 、私は/bin/catシェルを呼び出すことを幸せではありません。
バジルスタリンケビッチ

また、一部のシェル(scshなど)は、構文のようなPOSIXシェルを使用しません
バジルスタリンケビッチ

回答:


71

最も信頼性の高いものから最も信頼性の低いものまで(および「最も重い」)いくつかの方法:

  1. ps -p$$ -ocmd=。(Solarisでは、これfnamecmd。の代わりにする必要があります。OSXおよびBSD commandでは、cmd。の代わりにする必要があります。)
  2. 確認$BASH_VERSION$ZSH_VERSIONおよびその他のシェル固有の変数。
  3. チェック$SHELL; これは最後の手段であり、デフォルトのシェルを指定し、必ずしも現在のシェルを指定するわけではありません。

4
あなたも言及すべきです$0か?
ミケル

それは$0もっと複雑だから好きではありません:(1)それはただのベースネームかもしれません、(2)ログインシェルとしてそれを指定するためにフロントに '-'があるかもしれません。
ギーコサウルス

ps -p$$ -ocmd=""きれいです:-)
asoundmove

1
@geekosaur:たぶんそうですが、$0それでもなおより便利だと思われます$SHELL:あなたは同意しませんか?常にパイプでsed「-」を削除できます。
iconoclast

2
あなたは実行している場合tcsh$tcshおよび$version設定されます。これらは環境変数ではなく、シェル変数です。の非tcshバージョンを実行している場合csh、特徴的な変数はないと思います。そしてもちろん、変数をチェックするために使用される構文は、一方でcsh / tcshと、他方でsh / ksh / bash / zshとで異なります。
キーストンプソン14年

41

システムにインストールした4つのシェル(bash、dash、zsh、csh)で以下が機能することがわかりました。

$ ps -p $$

以下は、zsh、bash、およびdashで機能しますが、cshでは機能しません。

$ echo $0

2
また、魚では動作しません。
ロンE

@jiliagreの答えはおそらく今日使うだろうと思います。魚の%self代わりに使用することができます$$
スティーブンD

8

質問は使用されたシェルを要求するものであり、渡される潜在的な引数については説明していないため、それらを表示しない方法を次に示します。

$ ps -o comm= -p $$
ksh93 

6

いくつかのより軽い実装(Android電話、busyboxなど)についての注意:スイッチをps常にサポートしているわけではありませんが-p、のようなコマンドで検索を実行できますps | grep "^$$ "。(このgrep正規表現はPIDを一意に識別するため、誤検出はありません。


7
ps | grep $$たとえば、現在のプロセスが1234あり、プロセスが存在する場合は、依然として誤検知が発生する可能性があります12345
キーストンプソン14年

4

本当に簡単な方法が2つあります。

  • psコマンドの使用:

    ps -o comm= $$

    または

    ps -h -o comm -p $$

    どこ:

    • -hまたは=、ヘッダーを表示しないためのすべてのオプションを終了します。
    • -o commプロセスのベース名のみを表示するため(bashではなく/bin/bash)。
    • -p <PID> リストは、PIDフォームリストが提供された場合にのみ処理します。
  • / procプロセス情報の擬似ファイルシステムを使用します。

    cat /proc/$$/comm

    このオプションは、ps上記のコマンドとまったく同じように動作します。

    または

    readlink /proc/$$/exe

    これ/proc/PID/exeは、実行中のファイルにリンクします。この場合、/ bin / bash、/ bin / kshなどを指します。

    シェルの名前のみを取得するには、単に使用できます

    basename $(readlink /proc/$$/exe)

    これは、スクリプト、ソースコード、またはターミナルを使用している場合でも、使用中のシェルインタープリターのバイナリへのリンクとして常に同じ結果をもたらす唯一のオプションです。

    警告これにより最終的なバイナリが表示されるため、kshがksh93にリンクされるか、shがbashにリンクされる場合があることに注意する必要があります。

の使用方法は、現在のコマンドのPIDにリンクするを/proc介して非常に便利です/proc/self


3

Mac(comm)、Solaris(fname)およびLinux(cmd)と互換性のある他のすべての回答の組み合わせ:

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1

これにより、現在のディレクトリ名がわかります。また、下cshtcshそれが私を与えるAmbiguous output redirect.
-iconoclast

2

環境変数に保存している場合は、次を使用できます。

echo $SHELL

ほとんどの場合、ログインシェルのシェル実行可能ファイルのパス名が返されます。ただし、ログインシェルが現在実行しているものかどうかは不明です。
クサラナンダ

1

実行中のシェルのPIDは、var $$(ほとんどのシェル)によって指定されます。

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

バックティックを使用してjsh(Heirlommシェル)を機能させる。

多くのシェルでは、直接テストps -o args= -p $$busybox ash機能しますが、それで失敗します(解決済み)。

$1等しくなければならないチェック$$は、ほとんどの誤検知を取り除きます。

最後;:は、kshとzshのシェルを実行し続けるために使用されます。

より多くのシステムでのテストが役立ちます。うまくいかない場合はコメントしてください。

cshシェルのタイプでは機能しません。


OS / Xのテストでは、少なくとも3行が表示されます。1行はシェル、1行は1行、1行は1行/usr/lib/dyldです/private/var/db/dyld/dyld_shared_cache_x86_64
ステファンシャゼル

はい、それは今だけ/ binと/ usr / bin内のエントリを選択
ステファンChazelas

@StéphaneChazelasたぶん今はもっといいですか?

0

$MYSHELLはシェルに依存しない将来のテストのために設定しました~/.aliases

unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then        # zsh
  MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then                # bash
  MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then  # tcsh
  echo "DANGER: this script is likely not compatible with C shells!"
  sleep 5
  setenv MYSHELL "$shell"
fi

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

tcshそれはそう根本的に異なる(したがって警告と5秒間のポーズが)ですので、セクションでは、POSIXスタイルのスクリプトに転がり賢明そうです。(1の場合、cshスタイルシェルは行うことができない2>/dev/nullか、>&2有名に述べたように、有害と考えられCSHプログラミング暴言。)


-1

echo $0コマンドを使用するだけで、使用しているシェル<name_of_the_shell> --versionを確認したり、シェルのバージョンを確認したりできます。(例:)bash --version


スティーブンDは既にそれを言った:)
lese

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.