モードで実行するときに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).