Por que não existe shebang em .bashrc / .bash_profile?

21

Pesquisa simples: acabei de perceber que nunca vi um shebang além de um .bashrc script, o que me leva a pensar que o sistema usa o shell padrão para obtê-lo no login ( ${SHELL} ). Eu estou pensando sobre os motivos pelos quais esse é o caso, ou seja, é considerado um mau hábito usar algo diferente do shell padrão para executar o script de login.

    
por amphibient 29.08.2013 / 17:41

4 respostas

25

.bashrc e .bash_profile são scripts NÃO . Eles são arquivos de configuração que são originados sempre que bash é executado de duas maneiras:

  • interativo
  • faça login

A seção INVOCATION da página man bash é relevante.

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.

The following paragraphs describe how bash executes its startup files. If any of the files exist but cannot be read, bash reports an error. Tildes are expanded in file names as described below under Tilde Expansion in the EXPANSION section.

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

Você pode controlar quando eles são carregados através das opções de linha de comando, --norc e --noprofile . Você também pode substituir o local de onde eles foram carregados usando a opção --rcfile .

Como os outros mencionaram, você pode imitar como esses arquivos são carregados por meio do uso do comando source <file> ou do uso do comando . <file> .

É melhor pensar nessa funcionalidade da seguinte forma:

  1. o bash é iniciado com um ambiente vazio
  2. o bash abre um desses arquivos (dependendo de como foi chamado como interativo ou login e, em seguida, ...
  3. ... linha por linha executa cada um dos comandos dentro do arquivo ...
  4. quando completo dá o controle na forma de um prompt, aguardando entrada

Métodos para invocar

Este tópico parece surgir de vez em quando, portanto, aqui está uma pequena planilha com as várias maneiras de invocar bash e o que elas resultam. OBSERVAÇÃO: Para ajudar, adicionei as mensagens "originaram $ HOME / .bashrc" e "originaram $ HOME / .bash_profile" em seus respectivos arquivos.

chamadas básicas

  1. bash -i

    $ bash -i
    sourced /home/saml/.bashrc
    
  2. bash -l

    $ bash -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  3. bash -il -ou- bash -li

    $ bash -il
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  4. bash -c "..cmd .."

    $ bash -c 'echo hi'
    hi
    

    OBSERVAÇÃO: Observe que a opção -c não originou nenhum arquivo!

desabilitando os arquivos de configuração de serem lidos

  1. bash --norc

    $ bash --norc
    bash-4.1$ 
    
  2. bash --noprofile

    $ bash --noprofile
    sourced /home/saml/.bashrc
    
  3. bash --norc -i

    $ bash --norc -i
    bash-4.1$ 
    
  4. bash --norc -l

    $ bash --norc -l
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    
  5. bash --noprofile -i

    $ bash --noprofile -i
    sourced /home/saml/.bashrc
    
  6. bash --noprofile -l

    $ bash --noprofile -l
    bash-4.1$ 
    
  7. bash --norc -i -ou- bash --norc -l

    $ bash --norc -c 'echo hi'
    hi
    

Formas mais esotéricas de chamar bash

  1. bash --rcfile $ HOME / .bashrc

    $ bash -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    
  2. bash --norc --rcfile $ HOME / .bashrc

    $ bash --norc -rcfile ~/.bashrc 
    bash-4.1$ 
    

Estes falharam

  1. bash -i -rcfile ~ / .bashrc

    $ bash -i -rcfile ~/.bashrc 
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: /home/saml/.bashrc: restricted: cannot specify '/' in command names
    
  2. bash -i -rcfile .bashrc

    $ bash -i -rcfile .bashrc
    sourced /home/saml/.bashrc
    sourced /home/saml/.bash_profile
    bash: .bashrc: command not found
    

Há provavelmente mais, mas você entendeu, espero ...

O que mais?

Por fim, se você está tão encantado com esse tópico que gostaria de ler / explorar mais, sugiro dar uma olhada no Guia Bash para Iniciantes, especificamente na seção: 1.2. Vantagens do Bourne Again SHell . As várias subseções sob aquela, "1.2.2.1. Invocação" através de "1.2.2.3.3. Comportamento de shell interativo" explicam as diferenças de baixo nível entre as várias maneiras que você pode invocar bash .

    
por 29.08.2013 / 17:58
13
Os scripts

.bashrc só são executados pelo próprio bash . Eles não são independentes e não devem ser exec uted pelo sistema. (Na verdade, eles geralmente não são marcados como executáveis e, como você diz, eles não têm uma linha shebang.)

Esses scripts destinam-se a source d, pois geralmente fazem coisas como alterar variáveis de ambiente ( $PATH , por exemplo), que devem persistir após a conclusão do script. Então, seria realmente inútil tentar executar um em uma subcamada.

    
por 29.08.2013 / 17:45
4

Além das outras respostas, note que, se você quiser, nada o proíbe de colocar um shebang no início desses arquivos de configuração.

Isso não prejudicaria o fornecimento de shell, já que o shebang será processado como um comentário comum, ou seja, ignorado.

Isso pode ajudar editores que usam realce de sintaxe para descobrir qual linguagem de programação é usada no arquivo.

Note que alguns editores como vim fornecem maneiras alternativas como modelines para o último. ou seja, você sempre pode colocar linhas de modo no final de ~/.bashrc e ~/.bash_profile da seguinte forma:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
    
por 29.08.2013 / 18:06
1

Eu li isso em qualquer lugar, não sei exatamente onde, mas é verdade

The Bash manual is a bit confusing in this area, but Bash does not eXecute ~/.bash_profile like a shell script. It does read the file and then executes the commands within it (You can do something similar by running source ~/.bash_profile).

    
por 29.08.2013 / 17:45