De acordo com meu conhecimento, para determinar o shell atual que 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
o 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?
22
echo $0
não é uma opção aqui, pois o script será executado em muitas máquinas diferentes, onde a primeira coisa que precisarei verificar é o shell.#! /bin/sh -
no topo, ele será executadosh
. Você quer dizer de que variantesh
é?Respostas:
No Linux você pode usar
/proc/PID/exe
.Exemplo:
fonte
/bin/sed -r -e 's/\x0.*//' /proc/$$/cmdline
dá zsh ou ksh. (Seria US $ 0 se as conchas não corrigissem magicamente isso para dar o nome dos scripts)./proc
é o mais feio e portável possível./proc
não é 'feio'./proc
geralmente é uma solução muito elegante. Não portável sim, mas porque algo é portável não o torna feio./proc
feio porque os arquivos nele podem ir e vir ao capricho dos desenvolvedores e o conteúdo dos arquivos é passível de alterações sem aviso prévio, causando uma dor sem fim devido ao bitrot e aos formatos de arquivo de destino em movimento.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-again (bash), Korn (ksh88, ksh93, pdksh, mksh ), zsh, Ordinário compatível com a política (posh), Yet Another (yash), rc, akanga, es shells, desejo, tclsh, expect, perl, python, ruby, php, JavaScript (nodejs, SpiderMonkey shell e JSPL, pelo menos) , MS / Wine cmd.exe, command.com (MSDOS, FreeDOS ...).
Publiquei a versão inicial do script which_interpreter por volta de 2004 na usenet. Sven Mascheck tem um script (provavelmente mais útil para você) chamado whatshell, que se concentra na identificação de conchas semelhantes a Bourne. Você também pode encontrar uma versão mesclada de nossos dois scripts lá .
fonte
print
para ser uma função.bash 3.2.53(1)-release
como o intérprete que o interpreta.É isso que eu uso no meu .profile para verificar vários shells nos sistemas em que trabalho. Não faz distinções finas entre ksh88 e ksh93, mas nunca me falhou.
Observe que ele não requer um único garfo ou tubo.
fonte
ksh93
have$KSH_VERSION
. Essa variável vempdksh
e nunca chegou à AT&T ksh88.FCEDIT
.posh
(pdksh com a maioria dos recursos não POSIX removidos, então você provavelmente chamaria de "sh") não possui FCEDIT nem KSH_VERSION, mas possui PS3 (talvez não por muito tempo), embora seja improvável que alguém o tenha como shell de login . Observe também que o código acima não refletirá se estábash
ouzsh
não nosh
modo de emulação, o que pode ser um problema se você estiver usando$PROFILE_SHELL
para decidir se deseja ativar ou não esse recurso. Veja também o whatshell de Sven Mascheck para mais informações que você pode (ou não) querer verificar.Você poderia tentar
que fornecerá o nome do comando associado ao pid do script.
fonte
cmd
paracomm
quando POSIXIFICAR a resposta.Se houver o
lsof
comando disponível no seu sistema, você poderá obter o caminho completo do executável do shell pai, obtendo o PID paips
e analisando a saída delsof -p $ppid
(consulte Como determinar o shell atual no qual estou trabalhando? ).fonte
/
, se eu usarNR==4
, recebo o caminho para o pai dos shells.sh
s têm a$PPID
variável AtivadoLinux
, você pode usarreadlink -f "/proc/$PPID/exe"
.Fora do território Linux ou sem acesso ao sistema de arquivos / proc ou equivalente, você pode usar o pstree:
Supondo que você tenha o orgulho de
Em um Mac:
Em uma caixa Linux:
O formato e o estilo da saída da pstree diferem, dependendo do seu ambiente, mas você pode aplicar a saída ASCII e, em seguida, sed / tr / awk / etc. filtre a saída para obter o shell que está executando o script.
Portanto, uma versão de saída limpa (funciona para Mac OS ou Linux):
Rendimentos de execução:
E quando executado com um shell diferente:
Rendimentos:
Não é necessário nenhum sistema de arquivos raiz ou especial. Observe que minha filtragem pressupõe que o nome binário do shell termine com sh e que não haja entradas intermediárias que terminem com sh. Também pressupõe que você não nomeou seu script "sh" ou algum padrão de grep infeliz que obliterará as informações. :) Exigirá alguma personalização para o seu próprio ambiente, a fim de garantir um maior grau de proteção contra falhas.
fonte
Você pode usar o comando:
para descobrir o shell de dentro do script.
fonte
$SHELL
É o shell de escolha do usuário. Inicializado a partir do shell de login do usuário. Nada a ver com o shell atualmente em execução.