Diferença entre “echo $ SHELL” e “which bash”

4

Estou tentando determinar a localização do intérprete bash no meu sistema Solaris e estou um pouco confuso. Quando eu digito:

echo $SHELL

O caminho resultante é:

/bin/bash

e quando eu digito:

which bash

Eu recebo:

/usr/bin/bash

Alguém por favor pode explicar essa discrepância?

    
por Eugene S 19.07.2012 / 17:00

6 respostas

7

Seu sistema provavelmente tem bash instalado em vários locais, seja como versões diferentes de bash ou apenas links simbólicos.

which não é realmente um comando útil para a maioria das finalidades - não é realmente portátil ou muito utilizável em scripts. Em geral, type é melhor. A ideia por trás de which é fazer uma pesquisa em PATH do comando que você fornece como argumento.

$SHELL não reflete necessariamente o shell em execução no momento. Em vez disso, $SHELL é o shell preferido do usuário , que normalmente é o definido em %código%. Se você iniciar um shell diferente após o login, você não pode necessariamente esperar que /etc/passwd corresponda ao shell atual.

Como você pode ver, $SHELL e $SHELL são completamente não relacionados. Nenhum destes lhe dirá qual shell você está realmente executando.

Nota: Infelizmente, a correspondência do shell que você está executando atualmente com um local no sistema de arquivos é mais difícil do que se imagina. Isso ocorre porque os binários são carregados na memória para serem executados e, na maioria dos sistemas, a cópia na memória continuará sendo executada mesmo após você excluir o original do disco (o kernel pode manter a cópia do disco no "limbo" até que seja realmente não é mais necessário). Eu não acho que haja alguma maneira portátil de fazer isso - você teria que recorrer a métodos específicos de plataforma. Por exemplo, no Linux, examinar o link which deve dar uma ideia decente do que arquivo está em execução (onde /proc/$$/exe é o ID do processo do seu shell em execução). Infelizmente eu não estou familiarizado com o Solaris, então não posso ajudá-lo.

    
por 19.07.2012 / 19:09
8

As outras respostas são boas, mas eu gosto de dar uma demonstração.

% echo $SHELL
/bin/zsh
% which bash
/bin/bash
  • O primeiro comando informa qual shell será executada por login quando você efetuar login. No meu caso, /bin/zsh .
  • O segundo comando informa que a primeira ocorrência do meu comando $PATH the bash pode ser encontrada.

Um não implica o segundo, nem vice-versa.

Não vou reafirmar as respostas de outras pessoas, mas, além disso, quero salientar algumas coisas.

  • O shell padrão no Solaris é /bin/bash
  • No Solaris /bin é um link simbólico para ./usr/bin
  • O $PATH padrão no Solaris é /usr/bin:/bin

É por isso que você está vendo esse comportamento.

    
por 19.07.2012 / 19:28
1

echo $SHELL mostra o valor da SHELL variável de ambiente . Esta é uma configuração do usuário, que você pode definir para o caminho para o seu shell interativo favorito. Muitos programas invocam $SHELL quando solicitados a invocar um shell.

Eu acho que todas as shells deixam essa variável sozinha, a menos que seja desativada quando elas começam. Bash define SHELL para seu próprio caminho se a variável não for definida quando for iniciada. ATT ksh93 define SHELL para /bin/sh se não estiver definido (mesmo se /bin/sh for algum shell não relacionado). Ksh (todas as versões) verifica se SHELL é rsh quando é iniciado; se for, ele começa como um shell restrito .

which bash mostra o caminho para o executável bash (exceto quando não faz - você deve usar type bash ). Mais precisamente, ele procura os diretórios em $PATH para um executável chamado bash .

echo $0 , em um shell interativo, mostra o nome do comando que foi usado para invocar o shell.

ps $$ (digitado de um shell) exibe informações sobre o processo do shell ( $$ é expandido para o ID do processo do shell).

ls -l /proc/$$/exe mostra o caminho completo para o executável do shell

Por exemplo, meu shell favorito é zsh, mas aqui eu iniciei uma versão compilada em casa do bash que não está no $PATH .

% ./bash
$ echo $SHELL
/bin/zsh4
$ type bash
bash is /usr/bin/bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash
$ pwd
/home/gilles/src/bash-git
$ rm bash
$ echo $0
./bash
$ readlink /proc/$$/exe
/home/gilles/src/bash-git/bash (deleted)
    
por 20.07.2012 / 03:22
0

O comando which pesquisa os diretórios especificados na variável $PATH e retorna a primeira correspondência que encontrar, pois esse será o arquivo que será executado.

$SHELL retorna o nome canônico do arquivo atualmente em execução, por exemplo, /bin/bash . /usr/bin/bash é provavelmente um link para /bin/bash de qualquer maneira. Use $SHELL para encontrar o nome do seu interpretador de comandos atual.

    
por 19.07.2012 / 17:18
0

$SHELL é uma variável de ambiente definida com o caminho para o shell de login atual, que neste caso é bash. Se você usasse o comando chsh para alternar para outro shell (por exemplo, zsh), veria /bin/zsh quando você executou echo $SHELL .

O comando which na verdade não tem nada a ver com um shell específico, além de ser responsável por determinar qual programa seria executado se você chamasse esse programa diretamente. Você pode ter várias versões desse programa nos caminhos em sua variável $ PATH que podem ser executados. O motivo pelo qual você vê /bin/bash quando executa which bash é porque é onde o sistema encontra primeiro o programa bash na hierarquia que é $PATH .

Você pode executar o comando which em qualquer , não apenas um shell.

    
por 19.07.2012 / 17:13
0

No Solaris, uma maneira simples de saber qual shell está sendo executado e o que foi lançado é ptree , aqui meu shell é ksh:

$ ptree $$
408   /usr/lib/ssh/sshd
  1131  /usr/lib/ssh/sshd
    1132  /usr/lib/ssh/sshd
      1142  -ksh
        1146  ptree 1142

A maneira padrão de obter o comando executado é usar o comando tipo .

$ type bash
bash is /usr/bin/bash

Dado o fato de /bin e /usr/bin serem intercambiáveis no Solaris (e essa também é uma tendência em outros SOs semelhantes ao Unix), se o tipo bash retornará /bin/bash ou /usr/bin/bash dependerá apenas do que aparecer primeiro seu PATH e de qualquer maneira não importa muito.

    
por 20.07.2012 / 00:45