运行 sudo make install 时未传递环境变量

运行 sudo make install 时未传递环境变量

在模式下运行时,我pkg-config在使用 a 时遇到问题。我需要设置 pkg-config 来查找 中保存的 geany.pc 文件。MakefilesudoPKG_CONFIG_PATH/usr/local/lib/pkgconfig

如果我运行:

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

如果我运行sudo

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

所以我尝试运行我的 Makefile,如下所示:

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

我得到以下输出:

echo 

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

为什么突然PKG_CONFIG_PATH不设置了?我可以运行sudo -E然后它就可以工作,但我想了解为什么它突然不起作用。

编辑

之前运行导出没有帮助:

$ 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'

答案1

sudo echo $PKG_CONFIG_PATH

命令没有按照您的预期执行。 shell 变量在 sudo 运行之前在命令行上展开。尝试在 $PKG_CONFIG_PATH 周围使用单引号来停止 sudo 命令行上的扩展,您将在 sudo 运行之前停止 shell 扩展

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

事实上,您原来的命令是错误的,因为 sudo 内的 echo 不会进行变量扩展。您可以通过显式运行 shell 来强制执行此操作

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

这说明了为什么你的方法在没有参数的情况sudo make install下不起作用-Esudo

答案2

要回答为什么 make install 环境变量没有通过的问题...

默认情况下,sudo 在执行命令之前会清理环境。这是一项安全功能,可阻止坏人影响通过 sudo 允许的命令的操作。

您可以指定-E标志来保护环境,但您可能需要调整 sudoers 文件的内容以授予自己权限。

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

相关内容