每次我尝试使用su
(而不是su -
)以 root 身份登录时,它都不会源自.bash_profile
user1 的主目录。
基本上,我的/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
root
OS X 上的默认 shell是/bin/sh
.它sh
也是 的一个版本bash
,但是当使用名称sh
Bash调用时:
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 。