런타임 시 스크립트에서 셸 결정

런타임 시 스크립트에서 셸 결정

내가 아는 한, echo $0우리가 쉘에서 사용하고 있는 현재 쉘을 결정하는 것입니다. 대신, 스크립트가 실행 중인 쉘을 확인하기를 원합니다. 그래서 스크립트에서 인쇄를 시도했는데 $0스크립트 이름이 예상대로 반환되었습니다. 그래서 제 질문은 내 스크립트가 어떤 셸에서 실행되고 있는지 어떻게 알 수 있느냐는 것입니다.

답변1

귀하가 요청한 내용이 아닐 수도 있지만 이는 현재 누군가를 위해 통역하고 있는 통역사를 식별하는 데 어느 정도 도움이 될 것입니다.

  1. 톰슨 쉘( osh),
  2. 베른 쉘,
  3. Bourne Identity 쉘( bash),
  4. 코헨 쉘( ksh88, ksh93, pdksh, mksh),
  5. zsh,
  6. 정책을 준수하는 일반 셸( posh),
  7. 또 다른 쉘( yash),
  8. rc껍데기,
  9. akanga껍데기,
  10. ES 쉘,
  11. wishTCL 번역가,
  12. tclshTCL 번역가,
  13. expectTCL 번역가,
  14. 진주,
  15. 파이썬,
  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}'

관련 정보