GNU/Linux >> Linux の 問題 >  >> Linux

実行時にスクリプトでシェルを決定する

あなたが求めているものではないかもしれませんが、これは、現在それを解釈しているインタープリターを特定するためにある程度機能するはずです。

<オール>
  • トンプソンシェル (osh )、
  • ボーンシェル、
  • Bourne-again シェル (bash )、
  • Korn シェル (ksh88ksh93pdkshmksh )、
  • zsh
  • ポリシーに準拠した通常のシェル (posh )、
  • まだ別のシェル (yash )、
  • rc シェル、
  • akanga シェル、
  • シェル、
  • wish TCL通訳、
  • tclsh TCL通訳、
  • expect TCL通訳、
  • パール、
  • パイソン
  • ルビー、
  • PHP、
  • JavaScript (少なくとも nodejs、SpiderMonkey シェル、および JSPL)
  • MS/ワイン cmd.execommand.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 script の初期バージョンを投稿しました 2004 年頃、usenet で。 Sven Mascheck には、Bourne に似たシェルの識別に焦点を当てた whatshell という (おそらくより役立つ) スクリプトがあります。 2 つのスクリプトのマージ バージョンもそこにあります。


    Linux では /proc/PID/exe を使用できます .

    例:

    # readlink /proc/$$/exe
    /bin/zsh
    

    これは、私が作業しているシステムでさまざまなシェルをチェックするために .profile で使用するものです.ksh88 と ksh93 を細かく区別することはできませんが、失敗したことはありません.

    フォークやパイプは 1 つも必要ないことに注意してください。

    # 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. シェルスクリプトでタイムアウトしますか?

    2. ソースシェルスクリプトへのパスを決定しますか?

    3. シェルスクリプトの予期しない動作?

    1. インタラクティブシェルのセッションのプロセスとスクリプトのプロセス?

    2. $の意味は?シェルスクリプトでは?

    3. シェルスクリプトの現在のディレクトリ?

    1. Linux シェルの音訳スクリプト

    2. .sh ファイルがマルウェアになる可能性はありますか?

    3. シェルスクリプトはプログラミング言語ですか?