Vielleicht nicht das, wonach Sie fragen, aber das sollte bis zu einem gewissen Grad funktionieren, um den Interpreter zu identifizieren, der es gerade für ein paar wie
interpretiert- Thompson-Shell (
osh
), - Bourne-Shell,
- Bourne-again-Shell (
bash
), - Kornschale (
ksh88
,ksh93
,pdksh
,mksh
), zsh
,- Richtlinienkonforme gewöhnliche Shell (
posh
), - Noch eine Shell (
yash
), rc
Schale,akanga
Schale,- es Shell,
wish
TCL-Interpreter,tclsh
TCL-Interpreter,expect
TCL-Interpreter,- Perl,
- Python,
- Rubin,
- PHP,
- JavaScript (mindestens nodejs, SpiderMonkey-Shell und JSPL)
- MS/Wein
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 } *///'''
Ich habe die ursprüngliche Version dieses which_interpreter Skripts gepostet ca. 2004 im Usenet. Sven Mascheck hat ein (für Sie wahrscheinlich nützlicheres) Skript namens whatshell, das sich auf die Identifizierung von Bourne-ähnlichen Shells konzentriert. Dort finden Sie auch eine zusammengeführte Version unserer beiden Skripte.
Unter Linux können Sie /proc/PID/exe
verwenden .
Beispiel:
# readlink /proc/$$/exe
/bin/zsh
Dies ist, was ich in meinem .profile verwende, um auf den Systemen, an denen ich arbeite, nach verschiedenen Shells zu suchen. Es macht keine feinen Unterschiede zwischen ksh88 und ksh93, aber es hat mich nie im Stich gelassen.
Beachten Sie, dass keine einzige Gabel oder Leitung erforderlich ist.
# 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