Como verifico qual shell estou usando?

358

Eu li que o terminal não é nada além de shell, e o Unix oferece diferentes sabores de shell:

  • Casca de Bourne (sh)
  • C shell (csh)
  • Shell TC (tcsh)
  • Casca de Korn (ksh)
  • Bourne Novamente shell (bash)

Questões:

  • Quando abro uma janela de terminal, qual shell é aberto por padrão?
  • Como verifico quantas conchas estão instaladas?
  • Como altero o shell usado na minha conta?
LearNer969
fonte
@KasiyA Isso também está relacionado a askubuntu.com/questions/87853/…
daisy
Observe que o terminal é uma interface para o shell (que em algum momento costumava ser uma interface física) e o shell não é terminal - é um interpretador de comandos. Veja também askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Respostas:

428

Você pode digitar o seguinte comando no seu terminal para ver qual shell você está usando:

echo $0

O resultado será semelhante ao abaixo se você estiver usando o terminal bash ( Bourne Again Shell ):

-bash
kingmilo
fonte
2
é 0uma variável de ambiente?
Mi_Onim 22/02
43
@Mi_Onim $ 0 é o nome do processo em execução. Se você usá-lo dentro de um shell, ele retornará o nome do shell. Se você usá-lo dentro de um script, será o nome do script.
kingmilo
2
NOTA : isso não funcionará para interativo csh. % echo $0 No file for $0., mas funciona paratcsh
Sergiy Kolodyazhnyy 18/09/16
2
Não funciona se quando houver um link simbólico. Como bashcomosh
Anwar
9
@ Anwar faz um bom argumento, depois de obter o nome do shell echo $0, ls -l `which <name>` para ver se ele está vinculado a outro binário do shell.
JivanAmara
121

Para encontrar o shell que você possui no ambiente padrão, você pode verificar o valor da SHELLvariável de ambiente:

echo $SHELL

Para localizar a instância atual do shell, procure o processo (shell) com o PID da instância atual do shell.

Para encontrar o PID da instância atual do shell:

echo "$$"

Agora, para encontrar o processo com o PID:

ps -p <PID>

Juntar as peças:

ps -p "$$"
heemail
fonte
27
$ SHELL é o shell padrão para o sistema (ou usuário), que geralmente é (mas não necessariamente) o shell que realmente está sendo usado a qualquer momento.
28715 kingmilo
1
@kingmilo: Você está certo, resposta modificada.
heemayl
Achei isso muito útil quando se muda para um usuário através de 'su - <nome de usuário>', por exemplo, para a criação de postgres, Jenkins, ...
valentão
1
echo $SHELLme deu /bin/cshe ps -p $$me deu 22673 pts/1 00:00:00 bash. Kingmilo explicou (acima) por que eles não são os mesmos.
18446744073709551615
@ 18446744073709551615 Também não disse que são os mesmos. Por favor, leia a resposta cuidadosamente novamente; observe os formulários padrão e atuais .
heemayl
25

$SHELLfornece o shell padrão. $0fornece o shell atual.

Por exemplo: Eu tenho o bash como meu shell padrão, que eu uso para o meu Terminal App. Mas para meu aplicativo iTerm2, eu uso o comando como a janela se abre: /bin/ksh.

Então, o meu $0me dá /bin/kshno iTerm2. $SHELLme dá /bin/bashno iTerm2. $0, $SHELLme dá /bin/bashno Terminal

thenakulchawla
fonte
2
Esta é uma boa desambiguação das outras respostas mais votadas. Obrigado.
Michael Hoffmann
Para mim, eu tenho o zsh instalado e é o padrão atual, para mudar para o bash, basta digitar basho terminal. Para voltar ao zsh, digitezsh
Yousuf Azad
8

Para saber qual é o shell padrão para seu usuário, você pode executar:

echo "$SHELL"

Por exemplo, se você estiver usando o Bash, deverá obter a seguinte saída:

/bin/bash

Se você não alterou nenhuma configuração, deve ser o Bash, já que o Bash é o shell padrão no Ubuntu.

kos
fonte
/ bin / sh é a linguagem de comando do shell e não o Bourne Shell, edite sua resposta.
kingmilo 28/02
@kingmilo Não há nenhuma /bin/shreferência na minha resposta
kos
@ kol havia antes da edição. Observe também que $ SHELL é o shell padrão para o sistema (ou usuário), que geralmente é (mas não necessariamente) o shell que realmente está sendo usado a qualquer momento.
28715 kingmilo
1
@kingmilo Lendo a resposta novamente, acho que entendi qual é a sua preocupação, provavelmente não me expressei bem. I esclareceu o significado de "momento" na minha resposta
kos
1
@frederickjh peixe é um pouco estranho aqui. A $$variável é realmente definida pelo POSIX e funcionará na grande maioria dos shells. O peixe decidiu não seguir o padrão aqui, então acho justo ignorá-lo. Posso confirmar que $$funciona como esperado em sh, dash, bash, zsh, ksh, ash, tcsh e csh. De fato, do alto da minha cabeça, não consigo pensar em nenhuma outra concha, exceto em peixes que não funcionam.
terdon
8

As outras respostas tendem a usar recursos específicos do shell, mas estamos tentando descobrir qual shell estamos usando, portanto eles assumem a resposta para o problema. Por exemplo, nenhuma das respostas funcionará em peixes.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

Em vez disso, use a sintaxe $$ em uma chamada de sh, mas estamos procurando o PPID, não o PID. Use o PPID para encontrar o cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Obrigado pela melhoria @muru

Evan Benn
fonte
2
Você pode usar ppid=/ cmd=para omitir os cabeçalhos (e assim por diante tail -1) e considere olhar /proc/.../exepara ver qual arquivo está sendo executado (já que a cmdsaída pode ser manipulada por qualquer que tenha sido o shell).
Muni
1
Aparentemente, isso não funciona no busybox, devido à conformidade não posix: ref: github.com/broadinstitute/cromwell/pull/...
Evan Benn
4

O post original fez três perguntas. As respostas fornecidas abrangem a primeira pergunta: "Quando abro uma janela de terminal, qual shell é aberto por padrão?" Eles também respondem a uma pergunta que NÃO foi feita, a saber "Como posso descobrir qual shell está atualmente em execução no terminal?" No entanto, até onde eu vejo, ninguém respondeu à segunda ou à terceira pergunta originalmente feita, a saber "Como verifico quantas conchas estão instaladas?" e "Como altero o shell usado na minha conta?"

  • Para responder "Como verifico quantas conchas estão instaladas?" o seguinte comando listará todos os shells disponíveis:

gato / etc / conchas

Por exemplo, em uma instalação padrão do Ubuntu 18.10, isso fornece:

# / etc / shells: shells de login válidos

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

No entanto, por padrão, sh é um link simbólico para o dash, enquanto o rbash faz o link para o bash com a opção -r ("restrição do bash"), portanto, na verdade, existem apenas dois shells, e não quatro, como sugere a lista acima. O comando a seguir mostra se algum dos shells listados é de fato links simbólicos e, em caso afirmativo, para onde eles são vinculados: ls -l / bin

Michael D
fonte