Mungkin bukan yang Anda minta, tetapi ini harus bekerja sampai batas tertentu untuk mengidentifikasi juru bahasa yang saat ini menafsirkannya untuk beberapa hal seperti
- Thompson shell (
osh
), - Cangkang Bourne,
- Bourne-again shell (
bash
), - Cangkang Korn (
ksh88
,ksh93
,pdksh
,mksh
), zsh
,- Cangkang biasa yang mematuhi kebijakan (
posh
), - Kerang Lain (
yash
), rc
cangkang,akanga
cangkang,- cangkangnya,
wish
juru bahasa TCL,tclsh
juru bahasa TCL,expect
juru bahasa TCL,- Perl,
- Python,
- Ruby,
- PHP,
- JavaScript (setidaknya nodejs, SpiderMonkey shell, dan 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 } *///'''
Saya memposting versi awal dari which_interpreter skrip itu sekitar tahun 2004 di usenet. Sven Mascheck memiliki skrip (mungkin lebih berguna bagi Anda) yang disebut whatshell yang berfokus untuk mengidentifikasi cangkang mirip Bourne. Anda juga dapat menemukan versi gabungan dari dua skrip kami di sana.
Di linux Anda dapat menggunakan /proc/PID/exe
.
Contoh:
# readlink /proc/$$/exe
/bin/zsh
Inilah yang saya gunakan di .profile saya untuk memeriksa berbagai shell pada sistem tempat saya bekerja. Itu tidak membuat perbedaan yang jelas antara ksh88 dan ksh93, tetapi tidak pernah mengecewakan saya.
Perhatikan bahwa ini tidak memerlukan satu garpu atau pipa.
# 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