每当我偏离sudo su
正常轨道zsh
(使用哦我的天啊框架),我被迫默认使用旧的 Bourne shell ( sh
)(显然;这是大多数 *nix 类系统的标准行为)。如果我在运行 之后zsh
从内部运行,我会得到 Z shell,但没有 oh-my-zsh 的改进。sh
sudo su
有没有办法将 shellsudo su
启动改为zsh
?如果可以,是否也可以使用 来zsh
启动该实例oh-my-zsh
?
我正在使用 OS X 10.8.4。
答案1
以超级用户身份执行交互式 shell 的另一种方法是sudo -s
,它使用$SHELL
作为 shell。
正如其他答案中的评论所提到的,su -s /path/to/zsh
在 OS X 中不起作用。
OS X 不支持更改登录 shell /etc/passwd
,但你可以使用dscl
:
$ dscl . -read /Users/root UserShell
/bin/sh
$ sudo dscl . -change /Users/root UserShell /bin/sh /bin/zsh
$ dscl . -read /Users/root UserShell
/bin/zsh
$ sudo su
My-iMac# echo $0
zsh
My-iMac# exit
$ sudo dscl . -change /Users/root UserShell /bin/zsh /bin/sh
$
/bin/sh
在大多数平台上不再是 Bourne shell。它符合 POSIX 标准的 bash 版本在 OS X 中使用,在 Ubuntu 中使用 dash。
答案2
从su
手册页来看,有两种方法可以实现这一点。
第一种方法是简单地使用-s
或--shell
标志(假设您使用的是基于 *NIX 的操作系统,其版本su
支持此参数),然后输入您选择的 shell 的路径。如果无法找到传递的 shell,则su
恢复到以下方法,如果失败,则将尝试调用/bin/sh
。
例如,您可以强制su
启动zsh
(假设它存在于/bin/zsh
):
sudo su --shell /bin/zsh
第二种方法是修改为用户指定的默认shell root
(当心!)。这可以通过编辑文件/etc/passwd
并更改为用户指定的 shell 来完成root
。要查看默认指定的 shell,可以运行以下命令(假设超级用户是 root):
sudo grep root /etc/passwd
该命令应输出类似 的内容root:x:0:0:root:/root:/bin/bash
。您可以简单地将/bin/bash
(或系统中设置的任何内容)更改为指向zsh
。
答案3
可以轻松完成chpass
:
$ sudo chpass -s /bin/zsh
答案4
一个更干净的方法是在 root 的主目录中创建一个 .profile,以便在您的自定义 shell 被破坏时保护您的系统:
if [ -x /opt/local/bin/bash ]; then
SHELL=/opt/local/bin/bash
export SHELL
exec /opt/local/bin/bash
else
echo /opt/local/bin/bash not found using default shell of $SHELL
fi
只需将路径更改为您想要的 shell 而不是 bash 即可。