Por que nenhum shebang em .bashrc / .bash_profile?

22

Consulta simples: Acabei de perceber que nunca vi um shebang em cima de um .bashrcscript, o que me leva a pensar que o sistema usa o shell padrão para obtê-lo no login ( ${SHELL}). Estou pensando em razões pelas quais esse é o caso, ou seja, é considerado um mau hábito usar algo diferente do shell padrão para executar o script de login.

anfíbio
fonte
1
Há uma razão pela qual ele é chamado o bash rc ...
Ajedi32

Respostas:

28

.bashrce NÃO.bash_profile são scripts. São arquivos de configuração que são obtidos toda vez que são executados de duas maneiras:bash

  • interativo
  • entrar

A seção INVOCATION da página de manual do bash é relevante.

Um shell de login é aquele cujo primeiro caractere do argumento zero é a -ou iniciou com a --loginopção

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

Os parágrafos a seguir descrevem como bashexecuta seus arquivos de inicialização. Se algum dos arquivos existir, mas não puder ser lido, o bash reportará um erro. Tildes são expandidos em nomes de arquivos, conforme descrito abaixo em Expansão Tilde na seção EXPANSÃO .

Quando o bash é chamado como um shell de logon interativo ou como um shell não interativo com a --loginopção, ele primeiro lê e executa comandos do arquivo /etc/profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~/.bash_profile, ~/.bash_logine ~/.profile, nessa ordem, e lê e executa os comandos do primeiro que existe e é legível. A --noprofileopção pode ser usada quando o shell é iniciado para inibir esse comportamento.

Quando um shell de login sai, o bash lê e executa comandos do arquivo ~/.bash_logout, se existir.

Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de ~/.bashrc, se esse arquivo existir. Isso pode ser inibido usando a --norcopção A --rcfile file opção forçará o bash a ler e executar comandos do arquivo em vez de ~/.bashrc.

Você pode controlar quando eles são carregados pelas opções da linha de comando --norce --noprofile. Você também pode substituir o local de onde eles são carregados usando o --rcfilecomutador.

Como outros já mencionaram, você pode imitar como esses arquivos são carregados através do uso do source <file>comando ou do uso do . <file>comando.

É melhor pensar nessa funcionalidade da seguinte maneira:

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

Métodos para invocar

Este tópico parece surgir de vez em quando, então aqui está uma pequena tabela de dicas sobre as várias maneiras de invocar bashe o que elas resultam. NOTA: Para ajudar, adicionei as mensagens "sourced $ HOME / .bashrc" e "sourced $ HOME / .bash_profile "nos 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

    NOTA: Observe que a -copção não originou nenhum arquivo!

desativando 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

Maneiras 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

Provavelmente há mais, mas você entendeu o ponto, espero ...

O quê mais?

Por fim, se você está tão entusiasmado com este tópico que gostaria de ler / explorar mais sobre ele, sugiro dar uma olhada no Bash Beginners Guide, especificamente na seção: 1.2. Vantagens do Bourne Again SHell . As várias subseções dessa seção, "1.2.2.1. Invocação" a "1.2.2.3.3. Comportamento interativo do shell", explicam as diferenças de baixo nível entre as várias maneiras de invocar bash.

slm
fonte
@ amphibient - desculpe, ficou um pouco fora de controle, espero que as pessoas apreciem seu valor e não o punam com votos negativos. Com isso aqui, agora podemos referenciá-lo em outra resposta no caminho. 8-). Eu estava pensando em fazer uma mesa para mostrar isso, mas isso seria loucura 8-).
slm
Já os testou? Uma vez eu tentei seguir o que a minha festa faz no aperto e didnt bastante comportar-se como o manual sugerido
Bananguin
@ Bananguin - cada um desses comandos foi executado por mim e essa é a saída que foi produzida abaixo dos comandos. A única "coisa" em potencial com minha configuração pode ser que my .bash_profileinclua uma linha para a fonte .bashrc. Mas acredito que isso seja muito típico de configurações.
slm
Isso pode ser subjetivo, mas eu não diria isso .bashrce .bash_profilenão são scripts . IMHO, são scripts de finalidade específica, originados implicitamente durante a inicialização do bash ou explicitamente quando você precisa aplicar suas modificações. Eles não configuram apenas o ambiente bash (variáveis, funções, aliases ...) conforme o esperado dos arquivos de configuração. Eles podem executar qualquer ação como nos scripts comuns. Por exemplo, eles podem iniciar várias ações, como tarefas em segundo plano, gravar registros de log, inicializar alguns programas etc. De qualquer forma, obrigado pelo resumo detalhado!
Pabouk #
Esta resposta é ainda melhor do que qualquer resposta aqui stackoverflow.com/questions/415403/… !
22615 Jacob Tomlinson
13

.bashrcscripts são executados apenas por bashsi só. Eles não são independentes e não devem ser execusados ​​pelo sistema. (De fato, eles geralmente não são marcados como executáveis ​​e, como você diz, eles não têm uma linha shebang.)

Esses scripts devem ser sourced, pois geralmente fazem coisas como alterar variáveis ​​de ambiente ( $PATHpor exemplo), que devem persistir após a conclusão do script. Portanto, seria realmente inútil tentar executar um em um subshell.

rici
fonte
5

Além das outras respostas, observe 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, pois o shebang será processado como um comentário regular, ou seja, ignorado.

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

Observe que alguns editores como esse vimfornecem maneiras alternativas, como modelines para o último. ou seja, você sempre pode colocar as linhas de modo no final do ~/.bashrce ~/.bash_profileassim:

...
<code in ~/.bashrc>
...
# vim: ft=sh :
jlliagre
fonte
1
A resposta aceita do @slm acima é ótima, mas é isso que eu estava procurando, no que diz respeito à adição de um shebang ao início do meu, .bash_profilecom uma recomendação do ShellCheck.
jlucktay
1

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

O manual do Bash é um pouco confuso nessa área, mas o Bash não eXecute ~ / .bash_profile como um script de shell. Ele lê o arquivo e executa os comandos nele (você pode fazer algo semelhante executando o source ~ / .bash_profile).

Rahul Patil
fonte