모드에서 실행할 때 pkg-config
a를 사용하는 데 문제가 있습니다 . geany.pc에 저장된 파일을 찾으려면 pkg-config를 설정해야 합니다.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
명령이 예상대로 실행되지 않았습니다. sudo가 실행되기 전에 쉘 변수가 명령줄에서 확장됩니다. $PKG_CONFIG_PATH 주위에 작은따옴표를 사용하여 sudo 명령줄에서 확장을 중지하면 sudo가 실행되기 전에 셸 확장이 중지됩니다.
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는 변수 확장을 수행하지 않기 때문에 원래 명령이 잘못되었습니다. 쉘을 명시적으로 실행하여 이를 강제할 수 있습니다.
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).