更改 sudo su shell

更改 sudo su shell

每当我偏离sudo su正常轨道zsh(使用哦我的天啊框架),我被迫默认使用旧的 Bourne shell ( sh)(显然;这是大多数 *nix 类系统的标准行为)。如果我在运行 之后zsh从内部运行,我会得到 Z shell,但没有 oh-my-zsh 的改进。shsudo 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 即可。

相关内容