Možná ne to, co požadujete, ale mělo by to do určité míry fungovat, aby bylo možné identifikovat tlumočníka, který to aktuálně tlumočí, pro několik jako
- Shell Thompson (
osh
), - Bourne shell,
- Bourne-again shell (
bash
), - Korn shell (
ksh88
,ksh93
,pdksh
,mksh
), zsh
,- Obyčejný shell v souladu se zásadami (
posh
), - Ještě další shell (
yash
), rc
skořápka,akanga
skořápka,- es shell,
wish
TCL interpret,tclsh
TCL interpret,expect
TCL interpret,- Perl,
- Python,
- Ruby,
- PHP,
- JavaScript (alespoň nodejs, SpiderMonkey shell a JSPL)
- MS/Wine
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 } *///'''
Zveřejnil jsem počáteční verzi tohoto skriptu which_interpreter cca 2004 na Usenetu. Sven Mascheck má (pro vás pravděpodobně užitečnější) skript nazvaný whatshell, který se zaměřuje na identifikaci skořápek podobných Bourneovi. Můžete zde také najít sloučenou verzi našich dvou skriptů.
V linuxu můžete použít /proc/PID/exe
.
Příklad:
# readlink /proc/$$/exe
/bin/zsh
To je to, co používám ve svém .profilu ke kontrole různých shellů na systémech, na kterých pracuji. Nedělá jemné rozdíly mezi ksh88 a ksh93, ale nikdy mě to nezklamalo.
Všimněte si, že to nevyžaduje jedinou vidličku nebo trubku.
# 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
Jak simulovat odpojený síťový kabel nebo výpadek serveru?
Regulární výraz pro hledání dvojitých znaků v Bash