为什么 root 不获取 .bash_profile?

为什么 root 不获取 .bash_profile?

每次我尝试使用su(而不是su -)以 root 身份登录时,它都不会源自.bash_profileuser1 的主目录。

基本上,我的/var/root目录没有.bash_profile,所以我放了一个副本.bash_profile/var/root测试su -

它也不会自动来源.bash_profile(in var/root)。

无论如何,我想.bash_profile在使用 时自动从 root 帐户获取 user1 的su, 。

我应该怎么办?

(它以前工作过!有一天,它只是没有来源!也许 bash 中的某些设置发生了变化?当我source .bash_profile登录后输入时它工作了。)

我使用的是 Mac 和 OS X Yosemite。

答案1

rootOS X 上的默认 shell是/bin/sh.它sh也是 的一个版本bash,但是当使用名称shBash调用时:

sh尝试尽可能模仿历史版本的启动行为,同时也符合 POSIX 标准。

当作为交互式登录 shell 或带有选项的非交互式 shell 调用时--login,它首先尝试按顺序从/etc/profile和读取并执行命令。 ~/.profile...作为 sh 调用的 shell 不会尝试从任何其他启动文件读取和执行命令

也就是说,它.bash_profile根本不读,无论它是否作为登录 shell 调用。您可以.profile改为使用,甚至可以将一个符号链接到另一个。如果您使用 启动登录 shell su -l.profile则会在启动时加载,但.bash_profile永远不会加载。


你也可以使用dscl更改 root 的 shell(注意/etc/passwd不是用于确定 OS X 上的 shell)。您可以使用dscl . -read /Users/root UserShell;检查 root 当前的 shell在将其更改为其他内容之前,请查阅文档并仔细考虑。

另一种方法是简单地更改您的su调用以强制bash立即执行。

鉴于您所说的,我可能会推荐符号链接,但您可能希望研究一下 Bash 的更改POSIX模式做出并决定是否要拥有它们。

答案2

login因为它不被视为“登录 shell”(直接从, 或调用sshd),而是简单的“交互式 shell”。参见这里的例子:https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html

因此,强制su使用登录选项,即带有-l选项:

su -l

或者将您的环境放入.bashrc文件中。

答案3

root 用户将尝试执行 .bashrc 文件而不是 .bash_profile,因为您没有调用登录 shell。

来自 bash 手册man bash

   ~/.bash_profile
          The personal initialization file, executed for login shells
   ~/.bashrc
          The individual per-interactive-shell startup file

请注意~.bashrc 文件需要位于 root 用户的主目录中。

为了真正回答你的问题,如果你想使用 user1 的 .bashrc 文件,我建议你在 user1 的源 .bashrc 到 root 用户之间建立一个(符号)链接。

. /homedirectory/of/user1/.bash_profile您还可以考虑通过将该行添加到 root 用户的 .bashrc 文件来获取 user1 .bashrc 甚至 .bash_profile 。

相关内容