更改 sudo su 外壳

Jul*_*les 15 sudo zsh sh oh-my-zsh macos

每当我sudo su从我的正常zsh(使用oh-my-zsh框架)运行时,sh默认情况下我被迫使用旧的 Bourne shell ( )(显然;这是大多数 *nix 类系统上的标准行为)。如果我在运行后zsh从内部sh运行sudo su,我会得到 Z shell,但没有 oh-my-zsh 的改进。

有没有办法将shellsudo su启动更改为zsh?如果是这样,是否也可以zsh使用oh-my-zsh?

我使用的是 OS X 10.8.4。

Lri*_*Lri 23

以超级用户身份执行交互式 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
$ 
Run Code Online (Sandbox Code Playgroud)

/bin/sh在大多数平台上不再是 Bourne shell。它是OS X 中的 bash和 Ubuntu 中的 dash的POSIX 兼容版本


Bre*_*ugh 5

su联机帮助页来看,有两种方法可以实现此目的。


第一种方法是简单地使用-sor--shell标志(假设您使用的是基于 *NIX 的操作系统,其版本su支持此参数),后跟您选择的 shell 的路径。如果找不到传递的 shell,su则恢复到以下方法,如果失败,将尝试调用/bin/sh.

例如,您可以强制su启动zsh(假设它存在于/bin/zsh):

sudo su --shell /bin/zsh
Run Code Online (Sandbox Code Playgroud)

第二种方法是修改为用户指定的默认 shell root小心!)。这可以通过编辑文件/etc/passwd并更改为用户指定的 shell来完成root。要查看默认指定的 shell,可以运行以下命令(假设超级用户是 root):

sudo grep root /etc/passwd 
Run Code Online (Sandbox Code Playgroud)

该命令应该输出类似的内容root:x:0:0:root:/root:/bin/bash。您可以简单地更改/bin/bash(或系统中设置的任何内容)来代替zsh

  • 与往常一样,更改 root 的 shell 时要小心。您不希望处于单用户模式,并且拥有一个在损坏时需要 /usr 的 root shell。至少确保您的新 shell 没有比您要替换的 shell 更多的文件系统依赖项 (3认同)
  • @JulesMazur 请记住始终包含您的操作系统以避免这种混乱。 (2认同)