実行時にスクリプトからシェルを決定する

実行時にスクリプトからシェルを決定する

私が知っている限り、echo $0私たちがシェルで使用している現在のシェルを決定することです。代わりに、スクリプトが実行されているシェルを確認したいと思います。そのため、スクリプトから印刷しようとしましたが、$0スクリプト名が期待どおりに返されました。だから私の質問は、私のスクリプトがどのシェルで実行されているかをどうやって知ることができるかということです。

答え1

あなたが要求したものではないかもしれませんが、これは現在誰かのために通訳している通訳者を特定するのにある程度役立ちます。

  1. トンプソンシェル(osh)、
  2. ベルンシェル、
  3. Bourne Identity シェル( bash),
  4. コーエンシェル(ksh88、、、、、)、ksh93pdkshmksh
  5. zsh
  6. ポリシーに準拠した一般的なシェル(posh)、
  7. 別のシェル( yash)、
  8. rcシェル、
  9. akangaシェル、
  10. ESシェル、
  11. wishTCL 翻訳者、
  12. tclshTCL 翻訳者、
  13. expectTCL 翻訳者、
  14. 真珠、
  15. Python,
  16. ルビー、
  17. PHP、
  18. JavaScript(少なくともNodejs、SpiderMonkeyシェル、およびJSPL)
  19. MS/ワインcmd.exe, command.com(MSDOS, FreeDOS...).
'echo' +"'[{<?php echo chr(13)?>php <?php echo PHP_VERSION.chr(10);exit;?>}\
@GOTO DOS [exit[set 1 [[set 2 package] names];set 3 Tcl\ [info patchlevel];\
if {[lsearch -exact $1 Expect]>=0} {puts expect\ [$2 require Expect]\ ($3)} \
elseif {[lsearch -exact $1 Tk]>=0} {puts wish\ ($3,\ Tk\ [$2 require Tk])} \
else {puts $3}]]]' >/dev/null ' {\">/dev/null \
">"/dev/null" +"\'";q="#{",1//2,"}";a=+1;q='''=.q,';q=%{\"
'echo' /*>/dev/null
echo ">/dev/null;status=0;@ {status=1};*=(" '$' ");~ $status 1&&{e='"\
"';eval catch $2 ^'&version {eval ''echo <='^ $2 ^'&version''}';exit};e='"\
"';if (eval '{let ''a^~a''} >[2] /dev/null'){e='"\
"';exec echo akanga};eval exec echo rc $2 ^ version;\" > /dev/null
: #;echo possibly pre-Bourne UNIX V1-6 shell;exit
if (! $?version) set version=csh;exec echo $version
:DOS
@CLS
@IF NOT "%DOSEMU_VERSION%"=="" ECHO DOSEMU %DOSEMU_VERSION%
@ECHO %OS% %COMSPEC%
@VER
@GOTO FIN
", unless eval 'printf "perl %vd\n",$^V;exit;'> "/dev/null";eval ': "\'';
=S"';f=false e=exec\ echo n=/dev/null v=SH_VERSION;`(eval "f() { echo :
};f")2>$n` $f||$e Bourne-like shell without function
case `(: ${_z_?1}) 2>&1` in 1) $e ash/BSD sh;;esac;t(){
eval "\${$1$v+:} $f &&exec echo ${2}sh \$$1$v";};t BA ba;t Z z;t PO po;t YA ya
case `(typeset -Z2 b=0;$e $b)2>$n` in 00) (eval ':${.}')2>$n&&eval '
$e ksh93 ${.sh.version}';t K pdk;$e ksh88;;esac;case `(eval '$e ${f#*s}$($e 1
)$((1+1))')2>$n` in e12)$e POSIX shell;;esac;$e Bourne-like shell;: }
print "ruby ",RUBY_VERSION,"\n";exit;' ''';import sys
print("python "+sys.version);z='''*/;
s="";j="JavaScript";if(typeof process=="object"){p=console.log;p(process.title
,process.version)}else{p=print;p((f="function")==(t=typeof version)?"string"==
typeof(v=version())?v:(typeof build!=f?"":s= "SpiderMonkey ")+j+" "+v:(t==
"undefined"?j+"?":version)+"\n");if(s)build()}/*
:FIN } *///'''

初期バージョンをリリースしました。which_interpreter スクリプト2004年頃、ユーズネットで。 Sven Mascheckには次のスクリプトがあります。どんな殻Bourneのような殻を識別することに焦点を当てます。両方のスクリプトのマージバージョンもあります。そこ

答え2

Linuxでは/proc/PID/exe

例:

# readlink /proc/$$/exe
/bin/zsh

答え3

これは私が使用しているシステムのさまざまなシェルをチェックするために.profileで使用することです。 ksh88とksh93を細かく区別しませんが、決して失望させませんでした。

単一のフォークやパイプは必要ありません。

# 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

答え4

システムでコマンドが利用可能な場合は、lsof上位PIDを取得し、出力を解析して親シェル実行可能ファイルへのフルパスを取得できます。pslsof -p $ppid私が扱っている現在のシェルをどのように決定しますか?)。

#!/bin/sh
ppid="`ps -p "$$" -o ppid=`"
lsof -nP -p "$ppid" | awk 'NR==3 {print $NF; exit}'

関連情報