シェルのタイプを確認するにはどうすればよいですか?つまり、それが従来のsh、bash、ksh、csh、zshなどかどうか。
$Shell
はすべてのシェルで設定されているわけではないため、$0
または$Shell
のチェックは機能しないことに注意してください。古い$Shell
。
$0
は、シェルバイナリの場所を通知するだけで、/bin/sh
が実際のBourneシェルであるかbashであるかは通知しません。
答えは「いくつかの機能を試して、何がうまくいかないかを確認する」ことになると思います。ですから、誰かがそれを行うスクリプトを教えてくれれば、それは素晴らしいことです。
これは私の.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をチェックする必要はありません。
現在のシェルPIDを使用してシェルパスを見つけてください。
ps -p $$
少なくともsh、bash、kshで動作するはずです。
あなたが尋ねている理由が移植可能なシェルコードを書くことを試みることであるならば、それからシェルタイプを見つけて、それに基づいて切り替えることは信頼できない戦略です。バリエーションが多すぎます。
ここで何をしているかに応じて、 autoconfドキュメントの関連部分 を確認することをお勧めします。これには、さまざまなシェル異常の興味深い(そしていくつかの点では非常に悲惨な)動物学が含まれます。
移植可能なコードの目的のために、このセクションは非常に役立つはずです。シェルの亜種を見つける必要がある場合は、スニッフィングに役立つautoconf(または少なくとも生成される./configure
スクリプトの1つ)にいくつかのコードが埋め込まれている可能性があります。
次のようなものを使用できます。
Shell=`cat /proc/$$/cmdline`;
ああ、この問題がありました。 :D
簡単なハックがあります。ps -p $$
コマンドを使用して、現在実行中のプロセスのPIDを持つプロセスを一覧表示します。これはシェルです。これは文字列テーブル構造を返します。必要に応じて、シェルをAWKまたはSEDできます...
古いスレッドですが...
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
したがって、最初の行はシェルのタイプです=)