使用 /usr/bin/sudo 和 /bin/bash 时丢失环境信息

使用 /usr/bin/sudo 和 /bin/bash 时丢失环境信息

$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 -cPATH您在最后设置的将不会被读取。

您有几种选择:

  • 使用-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,交互性检查片段之前。

相关内容