Normalmente, podemos obter o ~/.bashrc
arquivo de origem usando este comando
source ~/.bashrc
mas se eu escrever isso em um shell script e executá-lo, nada acontece. Por quê?
Há alguma maneira de fazer isso?
Meu script:
#!/bin/bash
chmod a+x ~/.bashrc
source ~/.bashrc
Também tentei .
(ponto) em vez de source
. Mesmo resultado.
source ~/.bashrc
no shell do qual deseja alterar o ambiente. Você não pode alterá-lo de outro processo. Talvez (globalmente) a adição desse alias possa fazer parte do processo de instalação da sua GUI.Você
.bashrc
geralmente começa:Como seu script não possui o PS1 definido (porque não é interativo), ele não redefine o caminho porque sai mais cedo. Para demonstrar, modifique seu script:
Agora, isso permitirá que seus scripts funcionem com o novo
.bashrc
. Nota: assim que o script sair, o ambiente será definido como era antes de iniciar o script. As alterações serão refletidas na próxima vez que um terminal for iniciado.fonte
.bashrc
usa uma maneira mais confiável de verificar se o shell é interativo./etc/bash.bashrc
ainda tem o teste PS1.Experimentar:
Isso deve recarregar ~ / .bashrc, ~ / .bash_aliases, etc.
fonte
source
mas destrói todas as variáveis que o usuário definiu manualmente - o que pode ou não o que você deseja.exec bash
, da maneira que eu entendo o comando depois ainda estará nas mesmas configurações do bash de antes?Quero complementar a resposta de ravi :
Esse comportamento é específico ao Ubuntu (e provavelmente à maioria das distribuições derivadas), pois o
~/.bashrc
arquivo padrão inicia com um curto-circuito, o Ubuntu 18.04, por exemplo:Isso interromperá a avaliação do arquivo se ele estiver em execução em um shell não interativo, que é o caso do seu script, pois todos os scripts são executados em um shell não interativo e, subsequentemente, em todos os arquivos que você
source
herdará essa propriedade.eval
hackearEu descobri um truque feio para solucionar o Ubuntu especificamente, usando em
eval
vez desource
:Ele simplesmente pula as poucas primeiras linhas e avalia o restante,
~/.bashrc
para que o restante seja avaliado e modifique a execução atual.Esteja ciente de que é um número mágico e pode não funcionar nas versões do Ubuntu; mas pode ser uma boa solução se você estiver criando scripts para sistemas mais ou menos conhecidos.
Uma solução mais sofisticada pode envolver o uso de regex para direcionar os bits específicos que interrompem a avaliação.
Alternativa de Shebang
Outra alternativa que pode funcionar melhor em alguns cenários é forçar a execução do script em um shell interativo adicionando um sinalizador no shebang :
Esteja ciente de algumas coisas:
#!/usr/bin/env bash
formulário, mas desta forma você não pode iniciar o shell com argumentos .-i
conjunto de conseqüências tem seu próprio, entre eles, os programas solicitarão a interação do usuário e isso geralmente não se destina a scripts, por exemplo, a instalação dedeb
pacotes pode parar o script emdpkg configure
solicitações .set -i
eset +i
ativar e desativar o recurso onde eu precisava, mas isso não funciona .fonte
Nenhum dos outros métodos funcionou para mim [
source /path/to/file
vs. ./path/to/file
, alias, etc ...], até que, graças a este tutorial , descobri que usando o:#!/usr/bin/env bash
shebangem vez do mais simples,
#!/usr/bin/env
permite que os argumentos sejam transmitidos ao intérprete, que eu acho que é a chave aqui - consulte este documento para obter mais informações.De qualquer forma, se os comandos de origem de qualquer forma não estiverem funcionando para você, tente verificar seu shebang, esse pode ser o problema :)
fonte