如何使 zsh 在 Mac OS X(在 iTerm 中)上作为登录 shell 运行?
Posted
技术标签:
【中文标题】如何使 zsh 在 Mac OS X(在 iTerm 中)上作为登录 shell 运行?【英文标题】:How to make zsh run as a login shell on Mac OS X (in iTerm)? 【发布时间】:2010-11-19 14:06:33 【问题描述】:当 zsh 在 Mac OS X 上设置为登录 shell 时,当它由 iTerm 启动时,zsh 并不认为它是作为登录 shell 运行的,尽管它是以 '-zsh' 启动的('-' 是作为 arg[0]) 的第一个字符,这应该意味着它应该作为登录 shell 开始。
所以,当我将登录 shell 设置为 bash 时,bash 会识别 $0 中的第一个“-”并作为登录 shell 运行,但 zsh 不会,尽管它似乎应该这样做。
有没有办法让 zsh 识别 arg[0] 中的“-”,或者让 iTerm 使用 --login 命令行参数运行 shell?
【问题讨论】:
我知道这个问题已经有一段时间了,但请考虑接受@Harold Putman 的回答。这是唯一解决所提问题的地方。 【参考方案1】:启动时更改shell的命令是chsh -s <path_to_shell>
。 mac OS X 中的默认 shell 安装在 bin
目录中,所以如果你想更改为默认的 zsh
,那么你可以使用以下
chsh -s /bin/zsh
如果您使用不同版本的zsh
,那么您可能需要将该版本添加到/etc/shells
以避免出现非标准的shell 消息。例如,如果您想要自制版本的zsh
,那么您必须将/usr/local/bin/zsh
添加到上述文件中,您可以在一个命令sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
中执行此操作,然后运行
chsh -s /usr/local/bin/zsh
或者如果你想在一个命令中完成所有操作,如果你已经安装了 zsh,只需复制并粘贴它
sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells" && chsh -s /usr/local/bin/zsh
【讨论】:
我认为否决这个答案是不公平的。道具,因为它是唯一在答案正文中提到/etc/shells
的。
@heymatthew 之所以被否决,是因为它没有回答所提出的问题。它回答了一个完全不同的无关问题。
chsh: /usr/local/bin/zsh is an invalid shell
。我不得不这样做:sudo sh -c "echo '/usr/bin/zsh' >> /etc/shells" && chsh -s /usr/bin/zsh
【参考方案2】:
转到系统偏好设置的用户和组窗格 -> 选择用户 -> 单击锁进行更改(左下角)-> 右键单击当前用户选择 高级选项... -> 选择 Login Shell: /bin/zsh 和 OK
【讨论】:
这拯救了我的一天。我在 osx 小牛队。 这适用于默认的 zsh,不适用于 brew 安装的 zsh。【参考方案3】:在 iTerm -> 首选项 -> 配置文件选项卡 -> 常规部分设置命令为:/bin/zsh --login
【讨论】:
iterm2 在“常规”选项卡中似乎没有此选项。知道如何在不更改登录 shell 的情况下在 iterm2 中实现吗? 个人资料选项卡上的常规选项卡。 啊哈!有一个“常规”选项卡和一个“配置文件”>“常规”,这令人困惑。 或者在我的情况下/usr/local/bin/zsh --login
我正在使用它来更改我的 shell,而不是编辑 /etc/shells,因为这应该可以防止我的 shell 在更新后变得不可用。【参考方案4】:
chsh -s $(which zsh)
系统会提示您输入密码,但一旦您更新设置,您在该计算机上启动的任何新 iTerm/Terminal 会话都将默认为 zsh。
【讨论】:
请先阅读问题。问题不在于设置默认 shell,问题在于 zsh 没有检测到它是作为登录 shell 启动的。 啊,抱歉。您是否尝试过使用 -i 标志强制 zsh 以交互模式启动? 他的回答确实使 zsh 在 iTerm 中作为 Mac OS X 上的登录 shell 运行。它只是没有按照你描述的方式去做。但它解决了您提出的问题(在标题中,而不是在正文中)。你在正文中结束的问题是一个完全不同的问题。如果这是你真正的问题(而不是如何让 zsh 作为登录 shell 运行),那么也许你应该改写标题中的问题。 如果chsh
告诉您“非标准shell”之类的信息,则意味着您必须将新shell 的路径添加到/etc/shells
。例如,如果您更改为由 homebrew 安装的 zsh 版本,则可能会发生这种情况,该版本将其放入 /usr/local/bin/zsh
。
chsh -s $(which zsh)
可用于确保路径正确。【参考方案5】:
使用login
实用程序创建登录shell。假设您要登录的用户的用户名是 Alice,并且 zsh 安装在 /opt/local/bin/zsh
中(例如,通过 MacPorts 安装的更新版本)。在 iTerm 2 中,转到 Preferences、Profiles,选择您要设置的配置文件,然后在 Command 中输入:
login -pfq Alice /opt/local/bin/zsh
有关选项的更多详细信息,请参阅man login
。
【讨论】:
这 100% 不是答案。 Yes 会改变你默认生成的 shell,但这不是关于如何创建 shell 的“登录”实例的答案,即从头开始为所有变量提供资源。【参考方案6】:您是否尝试过编辑 account settings 中的 shell 条目。
转到帐户首选项,解锁,然后右键单击您的用户帐户以显示高级设置对话框。您的 shell 应该是 /bin/zsh,并且您可以适当地编辑该调用(即添加 --login 参数)。
【讨论】:
不幸的是,这不起作用:我可以使用 chsh 设置我喜欢的任何 shell(只要我在 /etc/shells 中列出了这个 shell),但是不能将命令行参数添加到shell 高级首选项对话框(iTerm 无法启动 shell)。 OS X 中的一些语法已更改,但要点是将默认 shell 设置为 /bin/zsh,正如 Brian 上面指出的那样 我很喜欢。刚刚用过这个答案,才发现我写了快4年了!以上是关于如何使 zsh 在 Mac OS X(在 iTerm 中)上作为登录 shell 运行?的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)
如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?
在 OS X 上从 zsh 切换到 bash,然后再切换回来?