GNU/Linux >> Znalost Linux >  >> Linux

určit shell ve skriptu za běhu

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

  1. Shell Thompson (osh ),
  2. Bourne shell,
  3. Bourne-again shell (bash ),
  4. Korn shell (ksh88 , ksh93 , pdksh , mksh ),
  5. zsh ,
  6. Obyčejný shell v souladu se zásadami (posh ),
  7. Ještě další shell (yash ),
  8. rc skořápka,
  9. akanga skořápka,
  10. es shell,
  11. wish TCL interpret,
  12. tclsh TCL interpret,
  13. expect TCL interpret,
  14. Perl,
  15. Python,
  16. Ruby,
  17. PHP,
  18. JavaScript (alespoň nodejs, SpiderMonkey shell a JSPL)
  19. 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

Linux
  1. Určit prostředí ve skriptu za běhu?

  2. Určení cesty ke zdrojovému skriptu Shell?

  3. Jak zacházet s přepínači ve skriptu Shell?

  1. Procesy v relaci v interaktivním prostředí versus ve skriptu?

  2. Význam $? Ve skriptu Shell?

  3. Shell Script pro tisk pyramidy hvězd

  1. Transliterační skript pro linuxové prostředí

  2. Je shell skript programovací jazyk?

  3. Spusťte skript prostředí jako jiný uživatel