determina o shell no script durante o tempo de execução

19

Segundo meu conhecimento, para determinar o shell atual, usamos echo $0 no shell. Em vez disso, quero que meu script verifique em qual shell ele está sendo executado. Então, tentei imprimir $0 no script e ele retorna o nome do script como deveria. Então, minha pergunta é como posso encontrar em qual shell meu script está sendo executado durante o tempo de execução?

    
por g4ur4v 04.04.2013 / 07:32

7 respostas

24

No linux você pode usar /proc/PID/exe .

Exemplo:

# readlink /proc/$$/exe
/bin/zsh
    
por 04.04.2013 / 16:04
46

Talvez não seja o que você está pedindo, mas isso deve funcionar até certo ponto para identificar o intérprete atualmente interpretando-o para alguns como Thompson (osh), Bourne, Bourne-novamente (bash), Korn (ksh88, ksh93, pdksh, mksh), zsh, compatível com as políticas Ordinária (posh), Yet Outra (yash), rc, akanga, es shells, desejo, tclsh, expect, perl, python, ruby, php, JavaScript (shell nodeJs, SpiderMonkey e JSPL pelo menos), cmd.exe do MS / Wine, 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 } *///'''

Eu postei a versão inicial do script which_interpreter circa 2004 na usenet. Sven Mascheck tem um script (provavelmente mais útil para você) chamado whatshell que foca na identificação de Bourne- como conchas. Você também pode encontrar uma versão mesclada de nossos dois scripts .

    
por 04.04.2013 / 11:03
10

Isso é o que eu uso no meu .profile para verificar vários shells nos sistemas em que trabalho. Ele não faz distinções entre ksh88 e ksh93, mas nunca falhou comigo.

Observe que não é necessário um único garfo ou tubo.

# 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
    
por 15.04.2013 / 13:22
5

Você poderia tentar

ps -o args= -p "$$"

que lhe dará o nome do comando associado ao pid do script.

    
por 04.04.2013 / 10:09
1

Se houver o comando lsof disponível em seu sistema, você pode obter o caminho completo do executável shell da matriz obtendo o PID principal via ps e analisando a saída de lsof -p $ppid (consulte Como determinar o shell atual em que estou trabalhando? ).

#!/bin/sh
ppid="'ps -p "$$" -o ppid='"
lsof -nP -p "$ppid" | awk 'NR==3 {print $NF; exit}'
    
por 04.04.2013 / 15:52
1

Fora do Linux ou sem acesso ao sistema de arquivos / proc ou equivelent, você pode fazer uso do pstree:

Supondo que você tenha o pid de

Em um Mac:

./test.sh 
16012
-+= 00001 root /sbin/launchd
 \-+= 00245 wingwong /sbin/launchd
   \-+= 04670 wingwong /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_2052597
     \-+= 11816 root login -pf wingwong
       \-+= 11817 wingwong -bash
         \-+= 16012 wingwong ksh ./test.sh
           \-+- 16013 wingwong pstree -p 16012

Em uma caixa do Linux:

./test.sh 
14981
bash(14981)---pstree(14982)

O formato e o estilo da saída da ptree difere, dependendo do seu ambiente, mas você pode impor a saída ASCII e depois sed / tr / awk / etc. filtrar a saída para obter o shell que está executando o script.

Então, uma versão de saída limpa (funciona para Mac ou Linux OS):

#!/usr/bin/env sh
pstree  -p $$  | tr ' ()' '222' | grep -i "sh$" | grep -v "$0" | tail -1

Em rendimentos de execução:

./test.sh 
sh

E quando for executado com um shell diferente:

#!/usr/bin/env ksh
pstree  -p $$  | tr ' ()' '222' | grep -i "sh$" | grep -v "$0" | tail -1

Rendimentos:

./test.sh 
ksh

Não é necessário nenhum sistema de arquivos raiz ou especial. Note, minha filtragem assume que o nome binário do shell termina com sh e que não há entradas intermediárias que terminam com sh. Também assume que você não nomeou seu script "sh" ou algum padrão grep infeliz que destruirá informações. :) Vai exigir alguma personalização para o seu próprio ambiente para garantir um maior grau de infalibilidade.

    
por 16.04.2013 / 01:59
-1

Você pode usar o comando:

$ echo $SHELL

para descobrir o shell de dentro do script.

    
por 04.04.2013 / 08:44

Tags