Macos 如何让iTerm使用brew显示的较新版本的bash?更改用户';OSX上的shell
当我进行Macos 如何让iTerm使用brew显示的较新版本的bash?更改用户';OSX上的shell,macos,bash,shell,default,homebrew,Macos,Bash,Shell,Default,Homebrew,当我进行brew升级时我发现我确实有更新的版本。我如何使用它 $ 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/
brew升级时
我发现我确实有更新的版本。我如何使用它
$ 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/shell
的内容包括:
/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\u版本
显示
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)
bash--version
(或bash-version
)将不报告当前shell的版本,而是报告bash
可执行文件在$PATH
中的第一个版本
[注:OSX 10.10(约塞米蒂)是第一个OSX版本,/usr/local/bin
放在系统路径之前,例如$PATH
中的/bin
。直到10.9,系统路径排在第一位。因此,在OP提出问题时,bash--version
报告了系统的bash版本(/bin/bash
),而不是自制安装的版本(/usr/local/bin/bash
)]
如果要了解当前Bash shell的版本,请使用:
echo $BASH_VERSION
换句话说:你的外壳可能已经被成功地更换了——你的测试有缺陷
您可以使用
chsh
更改当前用户的shell,如下所示:
[更新:切换到使用/usr/local/bin/bash
而不是/usr/local/ceral/bash//bin/bash
中的特定版本路径,因为自制软件会自动将/usr/local/bin/bash
中的符号链接指向最新安装的版本。@drevicko
请注意,系统将提示您输入密码。从该点创建的任何端子选项卡/窗口都将已经使用新外壳 @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中的注释将不允许未使用这些Shell的用户进行连接。
- 只需退出并重新启动
(或Terminal.app
)即可使更改生效-使用iTerm.app
-无需重新启动echo$BASH\u版本验证新shell
OP遇到错误的解释:
意味着chsh:/usr/local/cillar/bash/4.2.45/bin/bash:non-standard shell
还没有,或者没有以这种确切的形式列在/usr/local/cillar/bash/4.2.45/bin/bash
中/etc/shell
:当为属性状态:eDSAttributeNotFound
命令指定的倒数第二个(倒数第二个)参数与当前属性值不匹配时,会发生此-change
错误-必须指定属性的当前值才能对其进行更改,这是一个-无可否认的奇怪-要求dscl
虽然问题表明这两个条件都满足了,但我怀疑由于实验的原因,它们没有在正确的时间得到满足。答案是,是的,我需要:
brew安装bash
- 将路径添加到
/etc/shells
- 使用
:chsh-s
chsh-s/usr/local/ceral/bash/4.2.45/bin/bash
- 可能使用dscl设置外壳,即在
类型内dscl
>更改Local/Default/Users/UserShell/bin/bash/usr/Local/bin/zsh
- 退出终端(真正关闭应用程序,而不仅仅是它的窗口)
- 重新启动
重新启动后回显
$BASH\u版本
,显示4.2.45(2)-发布版
您不必执行任何操作,只需运行:
echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash
在此之后,iTerm和终端应使用/usr/local/bin/bash
进行新shell
chsh
,dscl
,以及用户和组首选项窗格都可以修改/var/db/dslocal/nodes/Default/Users/$USER.plist
当前版本的iTerm2允许进行更简单、侵入性更小的更改。在首选项>配置文件>常规中,在“命令”下,将“登录外壳”更改为例如:
为什么不改为更改登录shell(在Mac上使用
chsh
或等效工具)?我试过了。没用。添加到上面不确定/usr/local/bin/bash
和/bin/bash
是否相同。如果希望保留这两个版本(3.2.x和4.2.x),然后让/usr/local/bin/bash
指向旧的,让/bin/bash
指向新的。使用chsh
的错误可以通过在/etc/shells
中添加新bash的路径来修复。您可能的副本是正确的,并且回音版本可能是此错误的根源。我仍然对chsh
错误感到奇怪-可能是由于/etc/shells
中的“地下室”?@bmike:chsh
错误非标准shell
通常表示指定的shell不在/etc/shells
中;但是,您可以通过使用
sudo dscl . -change /Users/$USER UserShell /bin/bash /usr/local/bin/bash
echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash
/usr/local/bin/bash -l