每当我切换到超级用户时,我都想获取我的.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()
在切换出超级用户时执行某些操作。