当我执行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
答案 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 -s
:chsh -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。
chsh
,dscl
和用户&amp; “组”首选项窗格均修改/var/db/dslocal/nodes/Default/users/$USER.plist
。
答案 3 :(得分:0)
iTerm2的当前版本允许进行更简单,更轻松的更改。在“偏好设置”>“配置文件”>“常规”中,在“命令”下将“登录外壳”更改为例如:
/usr/local/bin/bash -l