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

21

Portanto, as páginas de manual do bash explicam o que são as camadas de login e interativas:

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

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to terminals (as determined by isatty(3)), or one started with the -i option. PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

Acho que isso significa que podemos ter 4 tipos diferentes de shells:

  • Conchas de login interativas,
  • Shells de login não interativos,
  • Shells interativos que não são de login,
  • Shells de não login não interativos

Mas por que temos conectores interativos / não interativos e de login / não-login? Por que a variedade? O que perderíamos se tivéssemos apenas um tipo de casca?

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

himBH

Alguns desses sinalizadores são explicados aqui , mas h , H , e m não são explicados. Existe um lugar que descreve todas essas bandeiras?

    
por 0xcafebabe 12.10.2013 / 07:46

1 resposta

19

Estes são os meus pensamentos sobre os diferentes "tipos" de conchas - infelizmente eu não testemunhei o surgimento do Un * x desde o começo (eu assumo que este conceito é cultivado historicamente em uma boa extensão), então por favor ser crítico.

  • Quando eu faço login em um sistema (atualmente, através do login gráfico 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, autostart alguns comandos, etc. Isso não deve acontecer toda vez que eu abrir um novo terminal. Portanto, há um conjunto de arquivos de configuração ( /etc/profile , ~/.bash_login e assim por diante, consulte o manual para obter uma lista precisa) originado somente por shells login .
  • Assim, para fechar as conexões, elimine alguns programas, execute um script de backup em que há ~/.bash_logout quando o shell login existir.
  • então, o shell "normal" que eu uso em um terminal, não deve ser um shell login , mas deve ler minhas preferências pessoais de ~/.bashrc , porque eu quero que meus atalhos de teclado interajam com o shell - portanto, este é um shell interativo, sem login .
  • e por último, mas não menos importante quando o bash é usado para scripts, nada disso é importante. bash deve 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 não-login .

Então, minha resposta à sua pergunta O que perderíamos se tivéssemos apenas um tipo de shell? 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 como bash ou via set builtin. 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 COMMANDS seçã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.
    
por 13.10.2013 / 09:14