Diferença entre o Shell de Login e o Shell de Não Login?

258

Eu entendo a diferença básica entre um shell interativo e um não interativo. Mas o que exatamente diferencia um shell de login de um shell que não seja de login?

Você pode dar exemplos de usos de um shell não-interativo interativo ?

    
por Igorio 08.05.2012 / 22:57

4 respostas

262

Um shell de login é o primeiro processo que é executado sob sua ID de usuário quando você efetua login em uma sessão interativa. O processo de login diz ao shell para se comportar como um shell de login com uma convenção: passar o argumento 0, que normalmente é o nome do executável do shell, com um caractere - preended (por exemplo, -bash enquanto normalmente seria bash As camadas de login geralmente lêem um arquivo que faz coisas como configurar variáveis de ambiente: /etc/profile e ~/.profile para o shell Bourne tradicional, ~/.bash_profile adicionalmente para bash , /etc/zprofile e ~/.zprofile para zsh , /etc/csh.login e ~/.login para csh, etc.

Ao efetuar login em um console de texto, ou por meio de SSH, ou com su - , você obtém um shell de login interativo . Quando você faz login no modo gráfico (em um X gerenciador de exibição ), você não recebe um login shell, em vez disso, você obtém um gerenciador de sessão ou um gerenciador de janelas.

É raro executar um shell de login não interativo , mas algumas configurações do X fazem isso quando você efetua login com um gerenciador de exibição, para organizar a leitura dos arquivos de perfil. Outras configurações (isso depende da distribuição e do gerenciador de exibição) leia /etc/profile e ~/.profile explicitamente ou não as leia. Outra maneira de obter um shell de login não interativo é efetuar login remotamente com um comando passado pela entrada padrão que não é um terminal, por exemplo, ssh example.com <my-script-which-is-stored-locally (em oposição a ssh example.com my-script-which-is-on-the-remote-machine , que executa um shell não interativo e não-login).

Quando você inicia um shell em um terminal em uma sessão existente (tela, terminal X, buffer de terminal do Emacs, um shell dentro de outro, etc.), você obtém um shell interativo, sem login . Esse shell pode ler um arquivo de configuração de shell ( ~/.bashrc para bash chamado como bash , /etc/zshrc e ~/.zshrc para zsh, /etc/csh.cshrc e ~/.cshrc para csh, o arquivo indicado pela variável ENV para Shells compatíveis com POSIX / XSI, como dash, ksh e bash quando invocados como sh , $ENV se configurados e ~/.mkshrc para mksh, etc.).

Quando um shell executa um script ou um comando passado em sua linha de comando, ele é um shell não interativo, sem login . Esses shells são executados o tempo todo: é muito comum que quando um programa chama outro programa, ele realmente executa um pequeno script em um shell para invocar esse outro programa. Algumas shells lêem um arquivo de inicialização nesse caso (bash executa o arquivo indicado pela variável BASH_ENV , zsh executa /etc/zshenv e ~/.zshenv ), mas isso é arriscado: o shell pode ser chamado em todos os tipos de contexto e quase não há nada que você possa fazer que não quebre algo.

Estou simplificando um pouco, veja o manual para os detalhes.

    
por 01.09.2012 / 04:07
34

Para saber se você está em um shell de login:

prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.

prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.

Informações podem ser encontradas em man bash (busca por invocação). Aqui está um trecho:

A login shell is one whose first character of argument zero is a -, or one started with the --login option.

Você pode testar isso sozinho. Sempre que você SSH, você está usando um shell de login. Por exemplo:

prompt> ssh user@localhost
fervor@localhost's password:
prompt> echo $0
-bash

A importância de usar um shell de login é qualquer configuração em /home/user/.bash_profile que será executada. Aqui está um pouco mais de informação se você estiver interessado (a partir de man bash )

"Quando o 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 ~/.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. "

    
por 21.10.2015 / 16:46
23

Em um shell de login, argv[0][0] == '-' . É assim que ele sabe que é um shell de login.

E, em algumas situações, ele se comporta de maneira diferente, dependendo do status "shell de login". Por exemplo. um shell, que não é um shell de login, não executaria um comando "logout".

    
por 09.05.2012 / 00:57
18

Um shell iniciado em um novo terminal em uma GUI seria um shell interativo de não-login. Ele criaria seu .bashrc, mas não seu .profile, por exemplo.

    
por 09.05.2012 / 00:20

Tags