Por que temos shells de login, sem login, interativos e não interativos?

23

Portanto, as páginas de manual do bash explicam o que são logins e shells interativos:

Um shell de login é aquele cujo primeiro caractere do argumento zero é um - ou um iniciado com a opção --login.

Um shell interativo é aquele iniciado sem argumentos de não opção e sem a opção -c cuja entrada e erro padrão estão conectados aos terminais (conforme determinado por isatty (3)) ou um iniciado com a opção -i. O PS1 está definido e $ - inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.

Eu acho que isso significa que podemos ter 4 tipos diferentes de conchas:

  • Escudos de login interativos,
  • Blocos de login não interativos,
  • Blocos interativos sem login,
  • Blocos não interativos de não logon

Mas por que temos shells interativos / não interativos e de login / sem login em primeiro lugar? Por que a variedade? O que perderíamos se tivéssemos apenas um tipo de concha?

Além disso, ao tentar determinar se estou em um shell de logon executando echo $-, ele gera:

himBH

Algumas destas bandeiras são explicados aqui , mas h, He mnão são explicadas. Existe um lugar que descreva todas essas bandeiras?

0xcafebabe
fonte

Respostas:

21

Esses são meus pensamentos sobre os diferentes "tipos" de conchas - infelizmente não testemunhei a ascensão do Un * x desde o início (presumo que esse conceito seja historicamente cultivado até um bom ponto), portanto, seja crítico.

  • Quando eu entro em um sistema (atualmente através do login gráfico do X), pode haver algumas tarefas que devem ser executadas uma vez, por exemplo, estabelecer uma conexão com algum tipo de servidor, apresentar-me a lista de tarefas de hoje, iniciar automaticamente alguns comandos, etc. não deveria acontecer toda vez que abro um novo terminal. Portanto, há um conjunto de arquivos de configuração ( /etc/profile, ~/.bash_logine assim por diante, consulte o manual para uma lista precisa) proveniente apenas por logon conchas.
  • Assim, para fechar as conexões, matar alguns programas, execute um script de backup ~/.bash_logoutquando o shell de login existir.
  • portanto, o shell "normal" que eu uso em um terminal não deve ser um shell de login , mas deve ler minhas preferências pessoais ~/.bashrc, porque quero que minhas combinações de teclas interajam com o shell - portanto, esse é um recurso interativo e não shell de login .
  • e por último, mas não menos importante, quando o bash é usado para scripts, nada disso é importante. bashdeve começar o mais rápido possível, ou seja, não deve ler nenhum arquivo de configuração. Este é um shell não interativo e sem logon .

Então, minha resposta para sua pergunta O que perderíamos se tivéssemos apenas um tipo de concha? está em uma palavra: "Flexibilidade".


A resposta para sua segunda pergunta é fácil:

$-lista o conjunto atual de opções. Eles podem ser definidos pelos parâmetros da linha de comando para bashou via o setbuiltin. Então você tem que olhar para dois lugares no manual:

  • OPTIONS seção:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDSseção, subseção set:

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
mpy
fonte
11
Woo, acredito que a resposta do @py à pergunta claramente formulada do OP é capaz de desambiguar com êxito alguma definição bastante útil. Sobre isso: Então, um shell sem login é apenas um subconjunto do shell de login, certo?
Tb0z