Eu tenho um script que insere algumas linhas na parte inferior do meu arquivo .bashrc
. Existe uma maneira de originá-las .bashrc
de 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 MyDir
deles llA
estará disponível, a menos que o .bashrc
arquivo 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ê
eval
executa 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_logout
arquivo para apagar arquivos temporários em "bash.d/" ou todo o conteúdo de "bash. d/", ou "~/.bashrc-temporary-addons".