Atualize `.bashrc` e recarregue

Atualize `.bashrc` e recarregue

Eu tenho um script que insere algumas linhas na parte inferior do meu arquivo .bashrc. Existe uma maneira de originá-las .bashrcde dentro do script para que essas alterações permaneçam quando o script for concluído? Aqui está um MWE de um script semelhante:

#!/bin/bash

echo "export MyDir='MyAnalysis'" >> ~/.bashrc
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc

source ~/.bashrc

Quando o script for executado, nenhum MyDirdeles llAestará disponível, a menos que o .bashrcarquivo seja obtido manualmente

Responder1

Não diretamente.

Seu script está sendo executado em um processo separado do seu shell interativo. Quaisquer alterações que o shell do script fizer no ambiente desaparecerão quando o shell for encerrado.Um processo filho não tem permissão para alterar o ambiente do pai.

Coisas que você pode fazer:

  • o script atualiza seu .bashrc e não faz mais nada: você origina seu bashrc se o script for concluído com sucesso

    bash yourScript.bash && source .bashrc
    
  • o script atualiza .bashrc eestampaso comando source: certifique-se de que não imprima mais nada. Então você evalexecuta o script.

    eval "$(bash yourScript.bash)"
    
  • o script atualiza o .bashrc etambémimprime o que faz. Você avalia: este é o script

    #!/bin/bash
    exec > >(tee -a "$HOME/.bashrc")
    
    echo "export MyDir='MyAnalysis'"
    echo "alias llA='ll MyAnalysis'"
    

    e você corre como

    eval "$(bash yourScript.bash)"
    
  • não atualize opaishell, mas inicie um novo shell interativo que lerá o bashrc

    #!/bin/bash
    {
        echo "export MyDir='MyAnalysis'"
        echo "alias llA='ll MyAnalysis'"
    } >> ~/.bashrc
    exec bash -i
    

    O shell pai não é atualizado.


Se você tornar o código de atualização .bashrc umfunção, funcionará conforme o esperado porque as funções são executadas no shell atual (por padrão):

addMyAnalysis() {
    echo "export MyDir='MyAnalysis'" >> ~/.bashrc
    echo "alias llA='ll MyAnalysis'" >> ~/.bashrc
    source ~/.bashrc
}

Uma técnica alternativa: crie um diretório “conf” $HOME/.bash.d. Escreva o arquivo bash lá

# this is "~/.bash.d/some_file.bash"
export MyDir='MyAnalysis'
alias llA='ll MyAnalysis'

E seu .bashrc origina qualquer arquivo bash nesse diretório:

if [[ -d ~/.bash.d ]]; then
    shopt -s nullglob
    for f in ~/.bash.d/*.bash; do
        source "$f"
    done
    shopt -u nullglob
fi

Responder2

Conforme apontado por @glenn-jackman, seu sourcing acontece em um subshell onde seu script é executado, e no final do seu script você retorna ao shell pai onde nenhum sourcing aconteceu e também .bashrc não é executado novamente - esta separação de pai e subshell decorrem de considerações gerais de segurança.

O que você procura é exec bash, mas não dentro do seu script, mas agrupado com ele, ou seja

bash your-script.sh && exec bash

Isso se comportaAté parecevocê fonteria e então permaneceria naquele shell onde você fonteu. Na verdadesubstituio shell atual com um novo shell, e esse novo shell começa, como todo shell (interativo), executando seu .bashrc, agora com suas alterações, e o mesmo acontece com cada novo shell/terminal que você inicia.

Observe que se você "exec bash" em seu script, ele substituiria o subshell onde seu script é executado, mas ainda sendo um subshell.

Se o seu objetivo é uma manipulação dinâmica e temporária de .bashrc, você deve considerar as sugestões de @glenn-jackman para fazer alterações em arquivos separados que podem ser facilmente excluídos a qualquer momento de sua escolha. Para isso você também pode ter uma linha permanente

[ -f ~/.bashrc-temporary-addons ] && source ~/.bashrc-temporary-addons

no final do seu .bashrc e depois faça (! somenteum">" na primeira linha para ter um arquivo novo)

echo "" > ~/.bashrc-temporary-addons
echo "export MyDir='MyAnalysis'" >> ~/.bashrc-temporary-addons
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc-temporary-addons

e, em um ponto de sua escolha, apenas

rm ~/.bashrc-temporary-addons

(Por causa do teste "-f", não haverá erro se "~/.bashrc-temporary-addons" não existir).

Se suas manipulações .bashrc durarem tanto quanto sua sessão, ou seja, até o logout (mas não reaparecerem no próximo login), você poderá criar um .bash_logoutarquivo para apagar arquivos temporários em "bash.d/" ou todo o conteúdo de "bash. d/", ou "~/.bashrc-temporary-addons".

informação relacionada