【问题标题】:How to reliably prepend or append to PATH for a user如何可靠地为用户添加或附加到 PATH
【发布时间】:2019-06-12 06:23:07
【问题描述】:

有 .bashrc、.profile 和 .bash_profile。我知道它们用于不同的情况。

我想将 ~/bin 添加到 PATH 总是,例如不管它是否是一个交互式会话。当有人像我一样 sudo 时,我也希望它能够工作。

我该怎么做?当有人像我一样 sudo 时,我看到上面 3 个文件都没有使用。当我的用户帐户被使用时,我希望始终可靠地将 ~/bin 预先添加到 PATH 中,包括当有人像我一样使用 sudo 时。

编辑:澄清:不,与某些重复问题的怀疑相反,这不是关于当爱丽丝运行“sudo bob some-program”时让爱丽丝的路径/环境延续到鲍勃。这是为了让 bob 在新使用 bob 来运行一个进程(包括但不一定限于交互式会话、非交互式会话和被 sudo 处理)时,总是有一个前面有 /home/bob/bin 的 PATH,但是尤其是在被 sudo 处理时,因为这似乎是最成问题的情况。

【问题讨论】:

  • sudo -i -u username 将用户的 shell 作为登录 shell 运行,它会调用 .bash_profile。似乎没有办法在普通的 sudo 中强制执行此行为。
  • @Nic3500 不是重复的,见后面的说明。
  • sudo -i 具有更改当前目录的不良副作用。如果不是这样,这就是我需要的。

标签: linux sudo


【解决方案1】:

我一直在使用以下脚本 (canonical copy),其中包含路径列表。诚然,我不使用sudo

# Significant care is taken to be sh-compatible; if bash or zsh could be
# required, it could be made simpler or more generic.

# Known source'rs:
# ~/.profile
# ~/.zshrc
# ~/.xprofile
# ~/.xsessionrc
# ~/.bashrc
# ~/.config/plasma-workspace/env/*.sh

has_PATH () {
    local tmp=":$PATH:"
    [ "${tmp}" != "${tmp#*:$1:}" ]
}

prepend_PATH () {
    has_PATH "$1" || PATH="$1:$PATH"
}

append_PATH () {
    has_PATH "$1" || PATH="$PATH:$1"
}

prepend_PATH /usr/local/bin
prepend_PATH ~/.local/bin
prepend_PATH ~/bin
prepend_PATH /usr/lib/ccache
append_PATH /usr/sbin
append_PATH /sbin
append_PATH /usr/local/games
append_PATH /usr/games
export PATH

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2015-10-02
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2012-10-04
    • 2011-01-24
    相关资源
    最近更新 更多