Ao executar sudo make install as variáveis de ambiente não são passadas

3

Eu tenho problemas com o uso de pkg-config em Makefile durante a execução no modo sudo . Eu preciso ter PKG_CONFIG_PATH definido para pkg-config para encontrar o arquivo geany.pc que é mantido em /usr/local/lib/pkgconfig .

Se eu correr:

$ echo $PKG_CONFIG_PATH
/usr/local/lib/pkgconfig

Se eu correr com sudo :

$ sudo echo $PKG_CONFIG_PATH
/usr/local/lib/pkgconfig

Então eu tento rodar meu Makefile que se parece com isso:

PLUGIN_DIR='pkg-config --variable=libdir geany'/geany

all: pyflakes.o
    gcc pyflakes.o -o geanypyflakes.so -shared 'pkg-config --libs geany'

pyflakes.o: pyflakes.c
    gcc -Wall -c pyflakes.c -fPIC 'pkg-config --cflags geany' 

install:
    echo ${PKG_CONFIG_PATH}
    cp geanypyflakes.so ${PLUGIN_DIR} --verbose

clean:
    rm geanypyflakes.so pyflakes.o


sudo make install

e recebo a seguinte saída:

echo 

cp geanypyflakes.so 'pkg-config --variable=libdir geany'/geany --verbose
'geanypyflakes.so' -> '/geany'

Por que, de repente, PKG_CONFIG_PATH não está definido? Eu posso rodar sudo -E e então funciona, mas eu gostaria de entender porque de repente não está funcionando.

EDITAR

A exportação em execução antes não ajudou:

$ export PKG_CONFIG_PATH='/usr/local/lib/pkconfig' && sudo make install
echo 

cp geanypyflakes.so 'pkg-config --variable=libdir geany'/geany --verbose
'geanypyflakes.so' -> '/geany'
    
por gruszczy 02.09.2011 / 14:55

2 respostas

4

O

sudo echo $PKG_CONFIG_PATH
O comando

não está fazendo o que você espera. A variável shell é expandida na linha de comando antes que o sudo seja executado. Tente usar aspas simples ao redor de $ PKG_CONFIG_PATH para parar a expansão na linha de comando do sudo e você irá parar a expansão do shell antes que o sudo rode

richm@royalcounty:~$ export PKG_CONFIG_PATH=hello
richm@royalcounty:~$ sudo echo $PKG_CONFIG_PATH
hello
richm@royalcounty:~$ sudo echo '$PKG_CONFIG_PATH'
$PKG_CONFIG_PATH

Na verdade, seu comando original está errado porque o eco dentro do sudo não fará nenhuma expansão variável. Você pode forçar isso executando o shell explicitamente

richm@royalcounty:~$ sudo -E echo '$PKG_CONFIG_PATH'
$PKG_CONFIG_PATH
richm@royalcounty:~$ sudo sh -c 'echo $PKG_CONFIG_PATH'

richm@royalcounty:~$ sudo -E sh -c 'echo $PKG_CONFIG_PATH'
hello

Isso demonstra porque seu sudo make install não funciona sem o argumento -E para sudo

    
por 02.09.2011 / 17:09
2

Para responder à pergunta de por que as variáveis do ambiente de instalação não são passadas ...

Por padrão, o sudo limpa o ambiente antes de executar seu comando. Este é um recurso de segurança para impedir que pessoas mal-intencionadas influenciem o funcionamento de comandos permitidos via sudo.

Você pode especificar o sinal -E para preservar o ambiente, mas talvez seja necessário ajustar o conteúdo do arquivo sudoers para obter permissão.

De man sudoers

   -E          The -E (preserve environment) option will override the
               env_reset option in sudoers(5)).  It is only available when
               either the matching command has the SETENV tag or the
               setenv option is set in sudoers(5).
    
por 02.09.2011 / 16:36

Tags