O problema foi diagnosticado nos comentários da pergunta. Na minha resposta, explicarei o que está acontecendo e como corrigi-lo.
O código
if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then
é perigoso porque você está usando expansões variáveis sem nome. "${OSSIEHOME}"
ou apenas "$OSSIEHOME"
expande para o valor da variável, mas ${OSSIEHOME}
de cotas externas é dividido em palavras. Em particular, se a variável estiver vazia ou não configurada, o comando à esquerda do operador &&
será expandido para [
-n
]
, o que é verdadeiro. Você pode ver no rastreio produzido por bash -x
que [
-n
]
é executado. Veja Por que meu script de shell engasgar com espaço em branco ou outros caracteres especiais? para mais detalhes. De agora em diante, lembre-se de sempre colocar aspas duplas em torno das substituições de variáveis e comandos¹.
if [ -n "${OSSIEHOME}" ] && [ -d "${OSSIEHOME}/share/aclocal/ossie" ]; then
…
Isso consertará o relatório de erros quebrado. Mas você ainda precisa garantir que a variável seja definida quando o script é executado. Não é suficiente verificar se echo $OSSIEHOME
imprime algo no seu shell atual. Você precisa garantir que a variável esteja no ambiente. Se você executar apenas OSSIEHOME=/usr/local/redhawk/core
, isso definirá apenas uma variável de shell. Para definir uma variável de ambiente, você precisa executar export OSSIEHOME=/usr/local/redhawk/core
(ou OSSIEHOME=/usr/local/redhawk/core
e, em seguida, export OSSIEHOME
).
Você adiciona que está chamando o script por sudo
. Em configurações típicas, o sudo remove a maioria das variáveis do ambiente. (Isso é vital para a segurança quando os usuários só têm permissão para executar comandos específicos, mas é um aborrecimento sem qualquer benefício de segurança strong se você tiver permissão para executar comandos arbitrários com o sudo.) Então você precisa informar explicitamente ao sudo para definir essa variável quando você executa o script.
sudo OSSIEHOME=/usr/local/redhawk/core /path/to/your/script
Se a variável já estiver definida no ambiente do shell e você não quiser repetir o valor, poderá usar
sudo OSSIEHOME="$OSSIEHOME" /path/to/your/script
Como alternativa, você pode ou não ter permissão para executar sudo -E /path/to/your/script
. A opção -E
diz ao sudo para preservar a maioria das variáveis de ambiente.
A execução de source
ou .
com o sudo não funciona, porque eles são internos do shell, não comandos executáveis. Eles são construídos em shell por causa do que eles fazem: executar um script em o mesmo shell que já está em execução , isto é, uma instrução no shell para ler comandos de um arquivo, não uma instrução para executar um programa separado. Isso não faz sentido com o sudo: se o script estava rodando no mesmo processo shell, ele estaria rodando com os mesmos privilégios.
¹ Para usuários avançados, adicione “a menos que você saiba por que precisa omiti-los”.