Como testar qual shell estou usando em um terminal?

69

Como verificar qual shell estou usando em um terminal? Qual é o shell que estou usando no MacOS?

user5837
fonte
2
@xenoterracide: pelo menos unix.stackexchange.com/questions/3645/… . A resposta do geekosaur é mais completa, então votei para encerrar a pergunta anterior.
Gilles 'SO- stop be evil' em
11
eco $ SHELL, não?
innocent-world
@ mundo inocente Não, echo #SHELLnão é bem isso. Veja o item 3 na resposta de geekosaur .
Basil Bourque
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"):

  1. ps -p$$ -ocmd=. (No Solaris, pode ser necessário em fnamevez de cmd. No OSX e no BSD, em commandvez de cmd.)
  2. Verifique se há $BASH_VERSION, $ZSH_VERSIONe outras variáveis específicas do shell.
  3. Cheque $SHELL; esse é o último recurso, pois especifica seu shell padrão e não necessariamente o shell atual .
geekosaur
fonte
4
Você deveria mencionar $0também?
Mikel
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:

$ echo $0
Steven D
fonte
2
Também não funciona em peixes.
Ron E
Eu acho que a resposta da @ jiliagre é provavelmente eu usaria hoje. No peixe %selfpode ser usado no lugar de$$
Steven D
8

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:

$ ps -o comm= -p $$
ksh93 
jlliagre
fonte
6

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.

palswim
fonte
7
ps | grep $$ainda pode dar falsos positivos se, por exemplo, seu processo atual for 1234e houver um processo 12345.
Keith Thompson
4

Existem duas maneiras realmente simples:

  • Usando o comando ps :

    ps -o comm= $$

    ou

    ps -h -o comm -p $$

    Onde:

    • -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.

David Goitia
fonte
3

Uma mistura de todas as outras respostas, compatíveis com Mac (comm), Solaris (fname) e Linux (cmd):

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
sebastien
fonte
isso me dá meu nome de diretório atual; também, abaixo cshe tcshisso me dáAmbiguous output redirect.
iconoclasta
2

Se você o salvou nas variáveis ​​de ambiente, pode usar o seguinte:

echo $SHELL
jasonleonhard
fonte
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).

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

Usando backticks para fazer o jsh (shell de Heirlomm) funcionar.

Em muitas conchas, o teste direto de ps -o args= -p $$ trabalhos, mas busybox ashfalha 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 cshtipo de conchas.


fonte
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

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

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 .)

Adam Katz
fonte
-1

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).

Sachin C
fonte
Steven D já mencionou isso
:)