POR QUE um shell ** login ** sobre um shell ** não-login **?

17

Eu tenho uma compreensão básica de dotfiles no sistema * nix. Mas eu ainda estou bastante confuso sobre isso Diferença entre o login shell e não -Login Shell?

Várias respostas diferentes (incluindo várias duplicatas) já abordaram os seguintes marcadores:

  • Como invocar um login ou shell sem login
  • Como detectar um login ou shell de não-login
  • Quais arquivos de inicialização serão consumidos por um login ou shell de não-login
  • Referido à documentação (por exemplo, man bash ) para mais detalhes

O que as respostas não contaram (e também algo sobre o qual ainda estou confuso) é:

  • Qual é o caso de uso de um shell login ou não-login ? (por exemplo, eu só configurei zshrc para zsh e isso é suficiente para a maioria dos requisitos de desenvolvimento pessoal, sei que não é tão simples quanto o que vimrc to vim )

  • Qual é a razão para usar um login em um shell não-login (além de consumir diferentes arquivos de inicialização e vida útil ciclos)?

por Xlee 18.11.2016 / 18:26

1 resposta

10

A ideia é que um usuário tenha (no máximo) um shell de login por host. (Talvez eu deva dizer, um shell de login por host por terminal - se você estiver logado simultaneamente em um host através de vários terminais, você esperaria ter vários shells de login.) Isso normalmente seria (sempre?) O shell primeiro que você recebe após o login (daí o nome). Então, este esquema permite que você especifique ações que você quer que aconteçam apenas uma vez por login e coisas que você quer que aconteçam toda vez que você inicia um novo shell (interativo).

Normalmente, todos os outros shell que você executa após efetuar login será um descendente (filho de filho de uma criança ...) da shell de login, e, portanto, herdará muitas configurações (variáveis de ambiente, umask , etc.) do shell de login. E, consequentemente, a ideia é que os arquivos de inicialização de login ( .login , .profile , etc.) deve definir as configurações herdáveis, e deixe .bashrc (ou o que mais você usa) lidar com os que não são ( set , shopt , variáveis de shell não exportadas, etc.)

Outra noção é que os arquivos de inicialização de login (e somente eles) deve fazer "trabalho pesado", ou seja, ações intensivas em recursos. Por exemplo, você pode querer ter certos processos correndo em segundo plano sempre que você estiver logado (mas apenas uma cópia (instância) deles). Você pode querer ter algumas informações de status (por exemplo, df ou who ) exibido quando você faz login mas não toda vez que você inicia um novo shell interativo. Especialmente se você tiver um programa / diálogo interativo (ou seja, aquele que exige entrada de você) que você deseja executar toda vez que fizer login você provavelmente não quer que ele seja executado toda vez que você inicia um novo shell. Como um exemplo extremo, vinte anos atrás, o Solaris registrou você para um único shell não-gráfico, não-windowed. (Eu acredito que isso mudou desde então.) Foi o trabalho de .login ou .profile (ou qualquer outra coisa) para iniciar o sistema de janelas, com um comando como startx . (Isso foi útil em parte porque havia vários sistemas de janelas disponíveis. Usuários diferentes tinham preferências diferentes. Alguns usuários usaram sistemas diferentes em diferentes situações, e nós tivemos um diálogo em nosso .profile que perguntou “Qual sistema de janelas você quer usar hoje?”) Obviamente, você não gostaria que isso acontecesse toda vez que você abriu uma nova janela ou digitou sh .

Já faz muito tempo desde que eu usei algo diferente de bash exceto para casos de borda. (Por exemplo, escrevo scripts com #!/bin/sh , Então, em alguns sistemas, meus scripts são executados com dash , e em outros eles correm com bash no modo POSIX. Algumas vezes por ano, corro csh / tcsh por alguns minutos para ver como ele lida com algo ou para responder a uma pergunta.) Se você usa vários shells (por exemplo, bash e zsh ) diariamente, seus padrões podem ser diferentes. Se o seu shell principal (como definido em /etc/passwd ) for bash , talvez você queira invocar um shell de login zsh , e, em seguida, talvez invocar alguns não-login zsh shells interativos subordinado a isso. Você provavelmente deve evitar ter um shell de login que é subordinado a outro shell de login do mesmo tipo.

Como mencionado em Diferença entre o Login Shell e o Non-Login Shell? , o aplicativo OS X Terminal executa um shell de login, portanto, um usuário típico normalmente terá várias "camadas de login" em execução simultaneamente. Este é um modelo um pouco diferente daquele que eu descrevi acima, e pode exigir que o usuário repensar o que ele faz em seu arquivo .login ou .profile (ou qualquer outro). Não sei se os desenvolvedores do OS X documentaram sua justificativa para essa decisão de projeto. Mas posso imaginar uma situação em que isso seria útil. Houve uma época em que eu habitualmente abria um punhado de janelas quando eu entrei e eu os colocaria em diferentes cores de texto e de fundo (escrevendo seqüências de escape ANSI na tela) para me ajudar a saber qual era qual. Cores terminais são um exemplo de algo que não é herdado por crianças-de-filhos, mas persiste dentro de uma janela. Então esse é o tipo de coisa que você gostaria de fazer toda vez que você iniciou uma nova janela do Terminal, mas não toda vez que você inicia um novo shell interativo.

    
por 18.11.2016 / 20:45