@xenoterracide: pelo menos unix.stackexchange.com/questions/3645/… . A resposta do geekosaur é mais completa, então votei para encerrar a pergunta anterior.
Não tenho tanta certeza de que "shell" tenha um significado bem definido. Por exemplo, você pode executar, xterm -e /bin/cat mas não estou feliz chamando /bin/catum shell.
Basile Starynkevitch
Também alguns shells (como scsh ) não usam shell POSIX como sintaxe.
Basile Starynkevitch
Respostas:
71
Várias maneiras, da mais à menos confiável (e da mais para a menos "pesada"):
ps -p$$ -ocmd=. (No Solaris, pode ser necessário em fnamevez de cmd. No OSX e no BSD, em commandvez de cmd.)
Verifique se há $BASH_VERSION, $ZSH_VERSIONe outras variáveis específicas do shell.
Cheque $SHELL; esse é o último recurso, pois especifica seu shell padrão e não necessariamente o shell atual .
Não gosto $0porque é mais complicado: (1) pode ser apenas o nome da base, (2) pode ter '-' na frente para designá-lo como um shell de login.
Geekosaur
ps -p$$ -ocmd=""é mais bonito :-)
asoundmove 18/03/11
11
@geekosaur: talvez sim, mas $0ainda parece mais útil do que $SHELL: você não concorda? Você sempre pode canalizá-lo sedpara remover o '-'.
Iconoclast
2
Se você estiver executando tcsh, $tcshe $versionserá definido. Essas são variáveis de shell, não variáveis de ambiente. Se você estiver executando uma versão não-tcsh csh, acho que não há variáveis distintas. E é claro que a sintaxe usada para verificar as variáveis difere entre csh / tcsh, por um lado, e sh / ksh / bash / zsh, por outro.
Keith Thompson
41
Descobri que o seguinte funciona nos quatro shells que instalei no meu sistema (bash, dash, zsh, csh):
$ ps -p $$
O seguinte funciona no zsh, bash e dash, mas não no csh:
Uma observação sobre algumas implementações mais leves (telefones Android, busybox etc.): psnem sempre tem suporte para o -pswitch, mas você pode realizar a pesquisa com um comando como ps | grep "^$$ ". (Esta grepregex identificará exclusivamente o PID, portanto, não haverá falsos positivos.
-hou finalizando todas as opções com =para não mostrar nenhum cabeçalho.
-o commpor mostrar apenas o nome da base do processo (em bashvez de /bin/bash).
-p <PID> lista apenas o processo com a lista de formulários PID fornecida.
Usando o sistema de pseudo-arquivos de informações do processo / proc :
cat /proc/$$/comm
Esta opção se comporta exatamente como o pscomando acima.
ou
readlink /proc/$$/exe
Isso /proc/PID/exevincula o arquivo que está sendo executado, que neste caso apontaria para / bin / bash, / bin / ksh, etc.
Para obter apenas o nome do shell, você pode apenas usar
basename $(readlink /proc/$$/exe)
Essa é a única opção que sempre fornecerá o mesmo resultado, mesmo se você estiver em um script, código de origem ou terminal, como links para o binário do interpretador de shell em uso.
Aviso Você deve estar ciente de que isso mostrará o binário final, portanto o ksh pode estar vinculado ao ksh93 ou sh ao bash.
O uso de /procé realmente útil via /proc/self, que vincula ao PID do comando atual.
Isso provavelmente retornará o nome do caminho do shell executável do seu shell de login. Não é certo que o shell de login seja o que você está executando no momento.
Kusalananda
1
O pid do shell em execução é dado pelo var $$ (na maioria dos shells).
No OS / X, em meus testes, recebo pelo menos três linhas, uma para o shell, uma para /usr/lib/dylde uma para /private/var/db/dyld/dyld_shared_cache_x86_64.
Stéphane Chazelas
Sim, agora ele seleciona apenas as entradas em / bin e / usr / bin
Stéphane Chazelas 8/15
@ StéphaneChazelas Talvez seja melhor agora?
0
Fiz $MYSHELLtestes futuros no meu shell-agnóstico ~/.aliases:
unset MYSHELL
if[-n "$ZSH_VERSION"]&& type zstyle >/dev/null 2>&1;then# zsh
MYSHELL=`command -v zsh`elif[-x "$BASH"]&& shopt -q >/dev/null 2>&1;then# bash
MYSHELL=`command -v bash`elif[-x "$shell"]&& which setenv |grep builtin >/dev/null;then# tcsh
echo "DANGER: this script is likely not compatible with C shells!"
sleep 5
setenv MYSHELL "$shell"fi# verifyif[!-x "$MYSHELL"];then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`[-x "$MYSHELL"]|| MYSHELL="${SHELL:-/bin/sh}"# default if verify failsfi
A tcshseção é provavelmente imprudente rolar em um script de estilo POSIX já que é tão radicalmente diferente (assim o aviso a cinco segundos de pausa). (Por um lado, cshconchas de estilo não podem fazer 2>/dev/nullou >&2, como observado no famoso discurso csh de programação considerado prejudicial .)
Você pode simplesmente usar o echo $0comando para verificar qual shell você está usando e <name_of_the_shell> --versionpara verificar a versão do shell. (por exemplo bash --version).
echo #SHELL
não é bem isso. Veja o item 3 na resposta de geekosaur .xterm -e /bin/cat
mas não estou feliz chamando/bin/cat
um shell.Respostas:
Várias maneiras, da mais à menos confiável (e da mais para a menos "pesada"):
ps -p$$ -ocmd=
. (No Solaris, pode ser necessário emfname
vez decmd
. No OSX e no BSD, emcommand
vez decmd
.)$BASH_VERSION
,$ZSH_VERSION
e outras variáveis específicas do shell.$SHELL
; esse é o último recurso, pois especifica seu shell padrão e não necessariamente o shell atual .fonte
$0
também?$0
porque é mais complicado: (1) pode ser apenas o nome da base, (2) pode ter '-' na frente para designá-lo como um shell de login.ps -p$$ -ocmd=""
é mais bonito :-)$0
ainda parece mais útil do que$SHELL
: você não concorda? Você sempre pode canalizá-losed
para remover o '-'.tcsh
,$tcsh
e$version
será definido. Essas são variáveis de shell, não variáveis de ambiente. Se você estiver executando uma versão não-tcshcsh
, acho que não há variáveis distintas. E é claro que a sintaxe usada para verificar as variáveis difere entre csh / tcsh, por um lado, e sh / ksh / bash / zsh, por outro.Descobri que o seguinte funciona nos quatro shells que instalei no meu sistema (bash, dash, zsh, csh):
O seguinte funciona no zsh, bash e dash, mas não no csh:
fonte
%self
pode ser usado no lugar de$$
Como a pergunta pede o shell usado e não fala sobre os possíveis argumentos passados, aqui está uma maneira de evitar mostrá-los:
fonte
Uma observação sobre algumas implementações mais leves (telefones Android, busybox etc.):
ps
nem sempre tem suporte para o-p
switch, mas você pode realizar a pesquisa com um comando comops | grep "^$$ "
. (Estagrep
regex identificará exclusivamente o PID, portanto, não haverá falsos positivos.fonte
ps | grep $$
ainda pode dar falsos positivos se, por exemplo, seu processo atual for1234
e houver um processo12345
.Existem duas maneiras realmente simples:
Usando o comando ps :
ou
Onde:
-h
ou finalizando todas as opções com=
para não mostrar nenhum cabeçalho.-o comm
por mostrar apenas o nome da base do processo (embash
vez de/bin/bash
).-p <PID>
lista apenas o processo com a lista de formulários PID fornecida.Usando o sistema de pseudo-arquivos de informações do processo / proc :
Esta opção se comporta exatamente como o
ps
comando acima.ou
Isso
/proc/PID/exe
vincula o arquivo que está sendo executado, que neste caso apontaria para / bin / bash, / bin / ksh, etc.Para obter apenas o nome do shell, você pode apenas usar
Essa é a única opção que sempre fornecerá o mesmo resultado, mesmo se você estiver em um script, código de origem ou terminal, como links para o binário do interpretador de shell em uso.
Aviso Você deve estar ciente de que isso mostrará o binário final, portanto o ksh pode estar vinculado ao ksh93 ou sh ao bash.
O uso de
/proc
é realmente útil via/proc/self
, que vincula ao PID do comando atual.fonte
Uma mistura de todas as outras respostas, compatíveis com Mac (comm), Solaris (fname) e Linux (cmd):
fonte
csh
etcsh
isso me dáAmbiguous output redirect.
Se você o salvou nas variáveis de ambiente, pode usar o seguinte:
fonte
O pid do shell em execução é dado pelo var $$ (na maioria dos shells).
Usando backticks para fazer o jsh (shell de Heirlomm) funcionar.
Em muitas conchas, o teste direto de
ps -o args= -p $$
trabalhos, masbusybox ash
falha nisso (resolvido).A verificação de que
$1
deve ser igual a$$
remove a maioria dos falsos positivos.O último
;:
são usados para manter o shell rodando para ksh e zsh.Testes em mais sistemas ajudarão; por favor, comente se não funcionar para você.
Não funciona no
csh
tipo de conchas.fonte
/usr/lib/dyld
e uma para/private/var/db/dyld/dyld_shared_cache_x86_64
.Fiz
$MYSHELL
testes futuros no meu shell-agnóstico~/.aliases
:A
tcsh
seção é provavelmente imprudente rolar em um script de estilo POSIX já que é tão radicalmente diferente (assim o aviso a cinco segundos de pausa). (Por um lado,csh
conchas de estilo não podem fazer2>/dev/null
ou>&2
, como observado no famoso discurso csh de programação considerado prejudicial .)fonte
Você pode simplesmente usar o
echo $0
comando para verificar qual shell você está usando e<name_of_the_shell> --version
para verificar a versão do shell. (por exemplobash --version
).fonte
Isso também funciona:
fonte