Por que o echo $ SHELL está sempre mostrando / bin / bash? [duplicado]

16

Não há muito o que explicar aqui. Só quero saber porque echo $ SHELL sempre dá a saída / bin / bash mesmo que eu mude para outros shells. O que tenho que fazer para garantir que o $ SHELL forneça o caminho de shell correto em que estou.

[root@localhost user]# echo $0
bash
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# csh
[root@localhost user]# echo $0
csh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# tcsh
[root@localhost user]# echo $0
tcsh
[root@localhost user]# echo $SHELL
/bin/bash
[root@localhost user]# sh
sh-4.2# echo $0
sh
sh-4.2# echo $SHELL
/bin/bash
sh-4.2# 
[root@localhost user]# which csh
/bin/csh
[root@localhost user]# which csh
/bin/csh
    
por Shashank Vyas 14.12.2016 / 07:18

3 respostas

33

$SHELL é a variável ambiente que contém seu shell preferido , não o shell atualmente em execução. Ele é inicializado por login ou qualquer outro aplicativo que faça o seu logon com base no campo shell na sua entrada de usuário no banco de dados passwd (seu shell de login ). / p>

Essa variável é usada para dizer a aplicativos como xterm , vim ... qual shell eles devem iniciar quando você iniciar um shell. Você normalmente o altera quando deseja usar outro shell que não o definido para você no banco de dados passwd .

Para obter um caminho do interpretador de shell atual, no Linux, e com shells como Bourne ou csh, você pode fazer:

readlink "/proc/$$/exe"

O rc equivalente:

readlink /proc/$pid/exe

O fish equivalente:

set pid %self
readlink /proc/$pid/exe

csh / tcsh define a variável $shell para o caminho do shell.

Em shells do tipo Bourne, $0 conterá o primeiro argumento que o shell recebeu ( argv[0] ) que por convenção é o nome do comando que está sendo chamado (embora login applications, novamente por convenção faça o primeiro caractere um - para informar ao shell que ele é um shell de login e deve, por exemplo, originar o arquivo .profile ou .login contendo suas personalizações de sessão de login) quando não chamado para interpretar um script ou quando chamado com shell -c '...' sem argumentos extras .

Em:

$ bash -c 'echo "$0"'
bash
$ /bin/bash -c 'echo "$0"'
/bin/bash

É o meu shell que chama /bin/bash em ambos os casos, mas no primeiro caso com bash como seu primeiro argumento e no segundo caso com /bin/bash . Várias shells permitem passar strings arbitrárias em vez disso:

$ (exec -a whatever bash -c 'echo "$0"')
whatever

Em ksh / bash / zsh / yash.

    
por 14.12.2016 / 08:26
2

Se a saída do comando echo $0 for -bash, isso significa que o bash foi chamado como um shell de login. Se a saída for apenas bash, você estará em um shell que não seja de login.

Como o ENV é acionado para mostrar a saída desejada, você está fornecendo /bin/bash

[root@dcconnect ~]# env | grep -i SHELL
SHELL=/bin/bash

A saída de echo #SHELL é extraída da variável ENV

    
por 14.12.2016 / 07:45
-1

O $0 é o comando que iniciou o seu shell. $SHELL é o shell padrão no seu sistema

    
por 14.12.2016 / 07:34