$PATH
我的问题是为什么在运行以下命令时会丢失环境信息:
/usr/bin/sudo -H -u <user> /bin/bash -l -c '<command>'
我正在尝试添加此命令的路径。因此我尝试为用户/mnt/anaconda
添加:~/.bashrc
export PATH="/mnt/anaconda/bin:$PATH"
还配置在visudo
Defaults env_keep = "PATH"
但是这些改变都没有生效,你们有什么建议吗?
答案1
bash
当您通过选项运行命令时-c
,会生成一个非交互式 shell。该~/.bashrc
文件是为非登录交互式 shell 提供的(也为登录交互式 shell 提供的,来自~/.profile
)。重点是交互性。
该~/.bashrc
文件开头有以下片段:
case $- in
*i*) ;;
*) return;;
esac
这意味着通过 检查 shell 选项$-
,如果 shell 不是交互式的(没有i
标志),则退出~/.bashrc
文件。
因此,当您通过 生成非交互式 shell 时bash -c
,PATH
您在最后设置的将不会被读取。
您有几种选择:
使用
-i
选项bash
,使其bash
充当交互式 shell 并读取~/.bashrc
文件:/usr/bin/sudo -H -u <user> /bin/bash -i -c '<command>'
由于您使用了
-l
指示bash
作为登录 shell 运行的选项,因此您可以将 放入其中,PATH
以便~/.profile
将其设置为source
-ed。请注意,考虑到您的需要,这可能不是一个好的选择。另一个非常糟糕的选择是将其放在文件
PATH
的最开始~/.bashrc
,交互性检查片段之前。