Como obter o meu .bashrc de um script de shell

0

Eu tenho um script bash script.sh que contém a seguinte linha:

sudo -u myusername sh ~/.profile

De um shell eu posso apenas chamar source ~/.profile , mas isso não funciona em um script e este comando faz. Força meu shell atual a ler meu ~/.profile

No entanto, meu ~/.profile contém as seguintes linhas:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Como é suposto a minha fonte ~/.bashrc . Mas, quando eu corro script.sh , recebo o seguinte erro:

/home/username/.profile: 24: /home/username/.profile: source: not found

É possível obter meu arquivo ~/.bashrc do meu ~/.profile (que está sendo chamado por outro script) sem alterar meu ~/.bashrc ou meu ~/.profile ?

Esse script.sh faz o download do meu arquivo ~/.profile e ~/.bashrc e os coloca no lugar certo, por isso, quero fazer o upload desses arquivos de script.sh depois de baixados e afetá-los na sessão do shell usado para executar script.sh

    
por Startec 15.04.2018 / 11:05

1 resposta

3

O erro vem da tentativa de executar o arquivo ~/.profile com sh , que não entende source ( sh usa . (ponto), que também funciona em bash e todos os outros Cartuchos POSIX).

Além disso, executar ~/.profile não irá definir as variáveis de ambiente que este arquivo define no shell que o executa. Isso ocorre porque ele é executado em sua própria sub-rede.

Um shell filho (que é o que você obtém quando executa ~/.profile em vez de fazer o sourcing) nunca afetará o ambiente do shell pai (o shell do qual você executa o script). Portanto, você não pode definir variáveis em ~/.profile e esperar que elas sejam definidas em seu script, a menos que você source o arquivo.

A execução de sudo source ~/.profile não ajudará aqui, pois sudo será um processo filho do shell atual.

Informações adicionais relacionadas:

Para configurar o ambiente para um script que não é executado a partir de um shell interativo (em que ~/.profile e ~/.bashrc já são originados), defina a variável BASH_ENV para o arquivo apropriado ao invocar o script. Isso fará o bash fornecer o arquivo $BASH_ENV antes de passar o controle para o seu script.

Por exemplo:

BASH_ENV="$HOME/.profile" "$HOME/scripts/myscript.sh"

Isso é apenas necessário se invocar o script a partir de uma sessão de shell não interativa, como uma tarefa cron, e se você precisar acessar variáveis de ambiente configuradas em ~/.profile ou qualquer arquivo que ~/.profile sources.

Em uma sessão de shell interativa, a variável BASH_ENV não precisa ser definida dessa forma, e o script não precisa originar ~/.bashrc nor ~/.profile , pois eles já foram originados.

    
por 15.04.2018 / 11:23

Tags