Questão Como verificar qual shell estou usando?


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

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

Questões:

  • Quando abro uma janela de terminal, qual shell é aberto por padrão?
  • Como faço para verificar quantos shells estão instalados?
  • Como faço para alterar o shell usado na minha conta?

236
2018-02-28 03:58


origem


Como determinar o shell atual em que estou trabalhando? em stackoverflow.com - αғsнιη
@KasiyA Isto também está relacionado askubuntu.com/questions/87853/… - d a i s y


Respostas:


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

echo $0

O resultado será algo parecido com o abaixo, se você estiver usando o festança (Bourne Again Shell) terminal:

-bash

288
2018-02-28 04:03



é 0 uma variável de ambiente? - Mi_Onim
@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
NOTA: isso não vai funcionar para interativo csh. % echo $0 No file for $0. , mas funciona para tcsh - Sergiy Kolodyazhnyy
Não funciona se quando um é symlink. Gostar bash Como sh - Anwar
@Anwar faz um bom ponto, depois de obter o nome do shell de echo $0, ls -l `which <name>`  para ver se ele é vinculado a outro binário do shell. - JivanAmara


Para encontrar o shell que você tem no ambiente padrão, você pode verificar o valor do SHELL variável de ambiente:

echo $SHELL

Para encontrar 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 "$$"

76
2018-02-28 04:06



$ SHELL é o shell padrão para o sistema (ou usuário), que geralmente é (mas não necessariamente) o shell que está sendo usado em um dado momento. - kingmilo
@kingmilo: Certo você está, resposta modificada. - heemayl
Achei isso muito útil ao alternar para um usuário por meio de 'su - <nome de usuário>', por exemplo para configurar postgres, jenkins, ... - bully
echo $SHELL deu-me /bin/csh e ps -p $$ deu-me 22673 pts/1 00:00:00 bash. Kingmilo explicou (acima) porque eles não são os mesmos. - 18446744073709551615
@ 18446744073709551615 Eu não disse que eles são os mesmos. Por favor, leia a resposta cuidadosamente novamente; Note o padrão e atual formulações. - heemayl


$SHELL lhe dá o shell padrão. $0 lhe dá o shell atual.

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

Então meu $0 me dá /bin/ksh no iTerm2. $SHELL me dá /bin/bash no iTerm2. $0,$SHELL me dá /bin/bash no terminal


16
2017-11-18 11:45



Esta é uma boa desambiguação das outras respostas mais votadas. Obrigado. - Michael Hoffmann


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

echo "$SHELL"

Por exemplo, se você estiver usando o Bash, você deve 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.


5
2018-02-28 04:02



/ bin / sh é a Linguagem de Comandos da Shell e não a Bourne Shell, edite sua resposta. - kingmilo
@kingmilo Não há /bin/sh referência na minha resposta - kos
@kol havia antes de editar. Observe também que $ SHELL é o shell padrão para o sistema (ou usuário), que geralmente é (mas não necessariamente) o shell que está sendo usado em um dado momento. - kingmilo
@kingmilo Por favor, note que a questão é "quando eu abrir terminal que shell é aberto por padrão ???" e que a resposta é "Se você não alterou nenhuma configuração, deve ser Bash, porque esse é o shell padrão no Ubuntu ", então a resposta se encaixa na pergunta - kos
@kingmilo Lendo a resposta novamente, acho que entendi qual é a sua preocupação, provavelmente não me expressei bem. Eu esclareci o significado de "atualmente" na minha resposta - kos


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

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

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

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

Obrigado pela melhoria @muru


2
2018-04-06 04:00



Você pode usar ppid=/cmd=omitir os cabeçalhos (e assim o tail -1s), e considere a possibilidade de /proc/.../exe para ver qual arquivo está sendo executado (desde cmd a saída pode ser manipulada por qualquer coisa que tenha executado o shell). - muru
Aparentemente isso não funciona no busybox, devido à não conformidade do posix: ref: github.com/broadinstitute/cromwell/pull/… - Evan Benn