当我在 OS X 上执行 su 时获取我的 bash 配置文件

当我在 OS X 上执行 su 时获取我的 bash 配置文件

每当我切换到超级用户时,我都想获取我的.bash_profile(或者可能是其他文件)的源代码。(.bash_profile是 Mac OS X 上的登录 rc,.bashrc是非登录脚本,.profile是为任何 shell 运行的登录 rc)。

简单来说,my.bash_profile让我使用终端更加方便,偶尔需要使用超级用户时,我感觉就像在尝试弹吉他而不用拇指。不仅如此,$PS1它还会导出到超级用户,但在 my 中定义并在 my 中使用的$PROMPT_COMMAND函数不会导出到该词法环境。.bash_profile$PROMPT_COMMAND

具体来说,我git-prompt.sh在我的 中获取脚本,并在 中.bash_profile使用导出的命令。因此,超级用户 shell 中的每个提示行前面都有警告:__git_ps1$PROMPT_COMMAND

bash: __git_ps1: command not found.

现在,从技术上讲,我可以修改系统范围的 rc 以/etc/profile实现该效果。我可以查看$HOME,如果这是我的家,那么可以查看$HOME/.bash_profile。但是,这不是可移植的。我必须/etc/profile在可能工作的每台主机上修改 。我想将此行为导出到我工作的所有主机上。

有人能想到一个完全包含在我自己的bash 配置文件?

无需对成为超级用户发出任何警告。我知道这样做很sudo不好,很糟糕,而且我这样做在道德和智力上都低人一等。:)

Mac OS Xsu没有这个-c选项,这本来是一个很好的解决方案。

答案1

如果你su从你的 $HOME,你可以这样做

. .bash_profile

答案2

好的。我现在有了一些成果。虽然不完美,但确实有效。主要的技巧是,我可以通过更改$PROMPT_COMMAND环境来使代码在超级用户 shell 中执行。$PROMPT_COMMAND切换到新环境时立即执行,而 su 保留 bash 环境变量。

因此,这是我使用的解决方案:

alias su="export REAL_HOME=$HOME && export SWITCHING_TO_SU=true && export PROMPT_COMMAND='source $HOME/.bash_profile; $PROMPT_COMMAND' && su"

现在,.bash_profile只要切换到超级用户,我的脚本就会运行,并且它会知道两个关键信息:1) 因为我要切换到超级用户,所以它正在运行;2) 我的真实主目录的位置。它可以使用该信息来执行它需要做的任何其他事情。特别是,我的 .bash_profile 将重置$PROMPT_COMMAND回其真实值,以便脚本仅在切换到 su 时才会被调用。在脚本的末尾,我有

if [[ "$SWITCHING_TO_SU" == 'true' ]]; then
    unset SWITCHING_TO_SU
    unset REAL_HOME
fi

我相信,可以使用基于别名的类似技巧exit()在切换出超级用户时执行某些操作。

相关内容