O script Bash não reconhece a variável como parte do caminho

1

Esta declaração if:

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; then
    OSSIE_AC_INCLUDE=${OSSIEHOME}/share/aclocal/ossie
else
    echo "Error: Cannot find the OSSIE aclocal files. This is not expected!"

Constantemente padroniza a mensagem de erro. Eu sei que OSSIEHOME tem um valor porque se eu fizer echo $OSSIEHOME da linha de comando eu obtenho

/usr/local/redhawk/core

E se eu codificar esse caminho no meu script, tudo funcionará bem. O problema é que tenho alguns scripts muito maiores, nos quais a codificação rígida do caminho correto não é uma opção. O que estou fazendo errado?

Editar: od -c <<<"$OSSIEHOME" me dá isso:

0000000 / u s r / l o c a l / r e d h a
0000020 w k / c o r e \n
0000030

ls -l /usr/local/redhawk/core/share/aclocal/ me dá isso:

drwxr-xr-x 2 root root 4096 Jul 19 10:02 ossie

A execução do script com bash -x dá:

+ rm -f config.cache
+ '[' -e /usr/local/share/aclocal/libtool.m4 ']'
+ '[' -e /usr/share/aclocal/libtool.m4 ']'
+ /bin/cp /usr/share/aclocal/libtool.m4 acinclude.m4
+ libtoolize --force --automake
+ '[' -n ']'
+ '[' -d /share/aclocal/ossie ']'
+ echo 'Error: Cannot find the OSSIE aclocal files. This is not expected!'
Error: Cannot find the OSSIE aclocal files. This is not expected!
+ '[' -n ']'
+ aclocal -I
aclocal: error: option '-I' requires an argument
aclocal: Try '/bin/aclocal --help' for more information.
+ autoconf
+ automake --foreign --add-missing

Eu tentei exportar OSSIEHOME para torná-lo global (apenas no caso), mas isso não funcionou. Em seguida, tentei executar o script em . script.sh e source script.sh problema é preciso executar o script com o sudo ou ele não terá as permissões necessárias para o trabalho. se eu fizer isso, recebo o erro

sudo: source: command not found
    
por nb12345 10.08.2017 / 17:45

1 resposta

3

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”.

    
por 11.08.2017 / 02:10