在模式下运行时,我pkg-config
在使用 a 时遇到问题。我需要设置 pkg-config 来查找 中保存的 geany.pc 文件。Makefile
sudo
PKG_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
下不起作用-E
sudo
答案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).