Continuo lendo sobre shells interativos, não interativos, de login e sem login.
(Isso ocorre no contexto de qual dos arquivos .bash* é lido).
Não entendo o que é cada tipo de shell, então vamos começar com o básico.
Se eu fizer ssh do meu mac para minha máquina Ubuntu, que tipo de shell está sendo ativado?
Responder1
Se você usar SSH em sua caixa do Ubuntu, receberá um shell de login interativo. Aqui está a diferença:
Interativo vs. não interativo:Qualquer shell onde você possa digitar em um prompt é interativo. Na verdade, muitos scripts testam a variável
$PS1
que contém a string do prompt para descobrir se eles são interativos. Se um shell estiver executando um script de shell, ele não será interativo.Então, se você fizer isso
ssh yourbox.example.com
, você obterá um shell interativo, assumindo as configurações padrão, enquanto se fizer issossh yourbox.example.com mighty_shellscript.sh
, você terminará com um shell não interativo e sua sessão SSH será encerrada quando o script terminar.Login versus não login:Ao fazer login no console ou remotamente (como SSH), ou quando você passa a
-l
opção parabash
, você obtém um shell de login. Caso contrário - como quando você abre uma janela de terminal - você obtém um shell sem login.Para testar se um shell é um shell de login, verifique se o nome do comando é
-bash
em vez debash
:ps -ef | grep [b]ash
Responder2
Você obtém um shell de login interativo. Mas não tome isso como garantido, verifique você mesmo.
Isso indica que você tem um shell de login (de man bash
):
# shopt | grep login
login_shell on
Isso indica que você tem um shell interativo, procure por i
(from man bash
):
# echo $-
himBH
O shell de login interativo que você obtém leu /etc/profile
e em vez de um de ~/.bash_profile
, ~/.bash_login
e ~/.profile
, conforme explicado em man bash
:
Quando bash é invocado como um shell de login interativo, ou como um shell não interativo com a opção --login,ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura por ~/.bash_profile, ~/.bash_login e ~/.profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível. A opção --noprofile pode ser usada quando o shell é iniciado para inibir esse comportamento.
Responder3
Ossh(1)página de manual diz,
Secomandofor especificado, ele será executado no host remoto em vez de em um shell de login.
e
Quando a identidade do usuário é aceita pelo servidor, o servidor executa o comando fornecido ou efetua login na máquina e fornece ao usuário um shell normal na máquina remota.
Isso me sugere que o shell que você está obtendo é um shell de login.
Responder4
Experimente este comando.
[max@localhost ~]$ echo $SHELL /bin/bash
você está obtendo esta saída porque seu tipo de shell está armazenado nesta variável SHELL
.
Para saber sua variável de ambiente digite este comando
[max@localhost ~]$ ambiente . . . HOSTNAME=localhost.localdomain SHELL=/bin/bash TAMANHO HISTÓRICO=1000 USUÁRIO = máx. . . .
enquanto digita echo $SHELL
ele irá imprimir o valor armazenado aqui
Este valor é atualizado a cada inicialização