问题描述
作为我的问题的例子,我的~/.bashrc
文件包含以下行:
export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so
因此,Numpy(Python)可以找到它需要运行的库,因为它是使用MKL和英特尔编译器构建的。这个工作流程不是最好的,但这是另一个故事。
我的问题是当我用’sudo'(但不是root)运行程序时,如何传递任意变量(如~/.bashrc
中的变量)?
目前,如果我跑:
sudo python -c "import numpy"
我收到一个错误:
ImportError: libimf.so: cannot open shared object file: No such file or directory*
一些建议如sudo -i
或sudo -E
在这里没有任何改变。
编辑:
我无法回答我的问题(不够点:D)但我会在这里发表评论,希望有其他Linux新手对sudo
陷阱感到疑惑。
[只是暂时!]这对我有用(~/.bashrc
):
alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
最佳解决方法
环境变量可以简单地在sudo
之后以ENV = VALUE的形式传递,并且可以通过follow命令接受。如果对这种用法有限制,我不知道,所以我的示例问题可以通过以下方式解决:
sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"
次佳解决方法
您提到的-E
选项似乎工作正常:
enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
第三种解决方法
您可以使用-E
sudo选项来保留当前环境(如果您有权这样做)
$ man sudo
-E, --preserve-env
Indicates to the security policy that the user wishes to preserve
their existing environment variables. The security policy may
return an error if the user does not have permission to preserve
the environment.
第四种方法
您需要通过sudo visudo
编辑sudoers
,因为您可能启用了安全策略插件,该插件会通过secure_path
选项覆盖您的PATH
。因此,添加路径到列表,您也可以使用env_keep
,例如:
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
要检查是否覆盖了PATH
,请运行以下命令:
$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
另请参见:Unix SE中的Why are PATH variables different when running via sudo and su?