web-dev-qa-db-ja.com

シェルのタイプを確認するにはどうすればよいですか

シェルのタイプを確認するにはどうすればよいですか?つまり、それが従来のsh、bash、ksh、csh、zshなどかどうか。

$Shellはすべてのシェルで設定されているわけではないため、$0または$Shellのチェックは機能しないことに注意してください。古い$Shell

$0は、シェルバイナリの場所を通知するだけで、/bin/shが実際のBourneシェルであるかbashであるかは通知しません。

答えは「いくつかの機能を試して、何がうまくいかないかを確認する」ことになると思います。ですから、誰かがそれを行うスクリプトを教えてくれれば、それは素晴らしいことです。

20
DrHyde

これは私の.profileで使用するものです。

# .profile is sourced at login by sh and ksh. The zsh sources .zshrc and
# bash sources .bashrc. To get the same behaviour from zsh and bash as well
# I suggest "cd; ln -s .profile .zshrc; ln -s .profile .bashrc".
# Determine what (Bourne compatible) Shell we are running under. Put the result
# in $PROFILE_Shell (not $Shell) so further code can depend on the Shell type.

if test -n "$ZSH_VERSION"; then
  PROFILE_Shell=zsh
Elif test -n "$BASH_VERSION"; then
  PROFILE_Shell=bash
Elif test -n "$KSH_VERSION"; then
  PROFILE_Shell=ksh
Elif test -n "$FCEDIT"; then
  PROFILE_Shell=ksh
Elif test -n "$PS3"; then
  PROFILE_Shell=unknown
else
  PROFILE_Shell=sh
fi

Ksh88、ksh95、pdksh、mkshなどを細かく区別していませんが、10年以上前に、自宅にあるすべてのシステム(BSD、SunOS、Solaris、Linux、 Unicos、HP-UX、AIX、IRIX、MicroStation、Cygwin)

起動時にcshが他のファイルをソースするため、.profileでcshを確認する必要がないようです。 Shebang行でインタープリターに明示的に名前を付けているため、作成するスクリプトはcshとBourne-heritageをチェックする必要はありません。

22
Jens

現在のシェルPIDを使用してシェルパスを見つけてください。

ps -p $$

少なくともsh、bash、kshで動作するはずです。

14
ziu

あなたが尋ねている理由が移植可能なシェルコードを書くことを試みることであるならば、それからシェルタイプを見つけて、それに基づいて切り替えることは信頼できない戦略です。バリエーションが多すぎます。

ここで何をしているかに応じて、 autoconfドキュメントの関連部分 を確認することをお勧めします。これには、さまざまなシェル異常の興味深い(そしていくつかの点では非常に悲惨な)動物学が含まれます。

移植可能なコードの目的のために、このセクションは非常に役立つはずです。シェルの亜種を見つける必要がある場合は、スニッフィングに役立つautoconf(または少なくとも生成される./configureスクリプトの1つ)にいくつかのコードが埋め込まれている可能性があります。

5
Norman Gray

次のようなものを使用できます。

Shell=`cat /proc/$$/cmdline`;
3
Let_Me_Be

ああ、この問題がありました。 :D

簡単なハックがあります。ps -p $$コマンドを使用して、現在実行中のプロセスのPIDを持つプロセスを一覧表示します。これはシェルです。これは文字列テーブル構造を返します。必要に応じて、シェルをAWKまたはSEDできます...

0
Cipi

古いスレッドですが...

GNU環境でsh --helpのようなものを取得します

BusyBox v1.23.2 (2015-04-24 15:46:01 GMT) multi-call binary.

Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]

Unix Shell interpreter

したがって、最初の行はシェルのタイプです=)

0
Arano-kai