Eu quero complementar a resposta do ravi :
Esse comportamento é específico para o Ubuntu (e provavelmente para as distribuições mais derivadas), já que o seu arquivo ~/.bashrc
padrão começa com um curto-circuito, o Ubuntu 18.04, por exemplo:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Isso interromperá a avaliação do arquivo se ele estiver sendo executado em um shell não interativo, que é o caso do seu script desde todos os scripts são executados em um shell não interativo e, subsequentemente, todos os arquivos source
herdarão essa propriedade.
eval
hack
Eu descobri um truque feio para solucionar o Ubuntu especificamente, usando eval
em vez de source
:
eval "$(cat ~/.bashrc | tail -n +10)"
Ele simplesmente pula as poucas primeiras linhas e avalia o resto do ~/.bashrc
, então o resto é avaliado e modifica a execução atual.
Lembre-se 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 do regex para direcionar os bits específicos que interrompem a avaliação.
Alternativa do Shebang
Outra alternativa que pode funcionar melhor em alguns cenários é forçar o script a ser executado em um shell interativo, adicionando um sinalizador no shebang :
#!/bin/bash -i
Esteja ciente de algumas coisas:
- É uma prática melhor para usar o formulário
#!/usr/bin/env bash
, mas desta forma você não pode iniciar o shell com argumentos .
- Usar o
-i
tem seu próprio conjunto de consequências, entre elas, os programas solicitarão a interação do usuário e isso geralmente não é destinado a scripts, por exemplo, a instalação de deb
packages pode parar o script em dpkg configure
prompts .
- Inicialmente, tentei usar
set -i
e set +i
para ativar e desativar o recurso onde precisei, mas isso não funciona .