如何让iTerm使用brew显示的更新版本的bash?在OSX上更改用户的shell

时间:2014-04-14 12:05:02

标签: macos bash shell default homebrew

当我执行brew upgrade时,我发现我确实有更新的版本。我该如何使用它?

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
$ brew upgrade bash
Error: bash-4.2.45 already installed
$ which bash
/bin/bash

我确实看到了

/usr/local/Cellar/bash/4.2.45/bin

但是当我做的时候

$ /usr/local/Cellar/bash/4.2.45/bin/bash

我还在

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.
08:06:45 mdurrant w89123148q1 /usr/local/Cellar/bash/4.2.45/bin master

/etc/shells的内容是:

/usr/local/Cellar/bash/4.2.45/bin/bash  # (I added this)
/usr/local/bin/bash
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

chsh似乎没有按照我的意愿行事:

$ chsh -s /usr/local/Cellar/bash/4.2.45/bin/bash
Changing shell for mdurrant.
Password for mdurrant:
chsh: /usr/local/Cellar/bash/4.2.45/bin/bash: non-standard shell
$ bash --version
GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)
Copyright (C) 2007 Free Software Foundation, Inc.

我的文件在这里:

$ l /usr/local/Cellar/bash/4.2.45/bin/bash
-r-xr-xr-x  1 mdurrant  admin  699688 Apr 14 19:54 /usr/local/Cellar/bash/4.2.45/bin/bash*

我还没有实际看到新的bash版本,无论如何我都是以交互方式调用它。

$ echo $BASH_VERSION显示

3.2.51(1)-release

我尝试使用dscl并做了

> change Local/Default/Users/mdurrant UserShell /bin/bash /usr/local/Cellar/bash/4.2.45/bin/bash

但得到了

<main> attribute status: eDSAttributeNotFound
<dscl_cmd> DS Error: -14134 (eDSAttributeNotFound)

现在列表显示

> UserShell: /usr/local/Cellar/bash/4.2.45/bin/bash

4 个答案:

答案 0 :(得分:40)

bash --version(或bash -version)不会报告CURRENT shell的版本,而是报告bash$PATH的{​​{1}}可执行文件的版本。

[注意:OSX 10.10(Yosemite)是第一个在/usr/local/bin之前/bin系统路径之前放置$PATH的OSX版本。系统路径最高可达10.9。因此,当OP询问他的问题时,bash --version报告了SYSTEM的bash的版本(/bin/bash),而不是Homebrew安装的版本(/usr/local/bin/bash)]

如果您想知道当前Bash shell的版本,请使用:

echo $BASH_VERSION

换句话说:您的shell可能已成功更改 - 您的测试存在缺陷。


可以使用chsh 来更改当前用户的shell,如下所示:

[更新:切换为使用/usr/local/bin/bash而不是/usr/local/Cellar/bash/<version>/bin/bash中的特定版本化路径,因为Homebrew会自动将符号链接指向最近安装的/usr/local/bin/bash版。给@drevicko的帽子提示。]

 # First, add the new shell to the list of allowed shells.
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
 # Change to the new shell.
chsh -s /usr/local/bin/bash 

请注意,系统会提示您输入密码 您从该点创建的任何终端选项卡/窗口都将使用新shell。

来自@bmike的额外提示:如果您想立即用新shell的实例替换当前 shell实例,请运行:

exec su - $USER  # instantly replaces current shell with an instance of the new shell

请注意,系统会再次提示您输入密码。


或者,使用dscl - OSX目录服务CLI - 来更改当前用户的shell;然而,这是更加繁琐

检查当前用户的shell,请使用:

dscl . -read /Users/$USER UserShell  # e.g. (default): 'UserShell: /bin/bash'

或更简单地说,echo $SHELL,它只输出文件路径(例如/bin/bash)。

将当前用户的shell更改为,例如/usr/local/bin/bash,请使用:

sudo dscl . -change /Users/$USER UserShell /bin/bash /usr/local/bin/bash

注意:

  • 倒数第二个参数必须是当前有效的
  • 新值不必包含在/etc/shells 交互式使用中,但/etc/shells状态Ftpd will not allow users to connect who are not using one of these shells.
  • 中的注释
  • 只需退出并重新启动Terminal.app(或iTerm.app)即可使更改生效 - 使用echo $BASH_VERSION验证新shell - 不需要重新启动。

OP遇到的错误说明

  • chsh: /usr/local/Cellar/bash/4.2.45/bin/bash: non-standard shell表示/usr/local/Cellar/bash/4.2.45/bin/bash中没有/etc/shells - 尚未,或者没有这种确切形式。
  • <main> attribute status: eDSAttributeNotFound:当为dscl命令指定的倒数第二个(倒数第二个)参数与当前属性不匹配时,会发生此-change错误值 - 这是一个 - 不可否认的奇怪 - 要求指定属性的当前值以便更改它。

虽然问题表明这两个条件都得到满足,但我怀疑由于实验,它们在正确时间没有得到满足。

答案 1 :(得分:1)

答案是,是的,我需要:

  • brew install bash
  • 添加/etc/shells
  • 的路径
  • 使用chsh -schsh -s /usr/local/Cellar/bash/4.2.45/bin/bash
  • 可能使用dscl来设置shell,即在dscl类型

    > change Local/Default/Users/<username> UserShell /bin/bash /usr/local/bin/zsh

最重要的是:

  • 退出终端(真正关闭应用程序,而不仅仅是它的窗口)。
  • 重新启动
重启后

回显$BASH_VERSION显示4.2.45(2)-release

答案 2 :(得分:1)

除了跑步之外,你不应该做任何其他事情:

echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash

之后,iTerm和终端应该使用/usr/local/bin/bash作为新的shell。

chshdscl和用户&amp; “组”首选项窗格均修改/var/db/dslocal/nodes/Default/users/$USER.plist

答案 3 :(得分:0)

iTerm2的当前版本允许进行更简单,更轻松的更改。在“偏好设置”>“配置文件”>“常规”中,在“命令”下将“登录外壳”更改为例如:

/usr/local/bin/bash -l