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

问题描述 投票:0回答:5

当我执行

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
macos bash shell default homebrew
5个回答
56
投票

bash --version
(或
bash -version
)不会报告当前 shell 的版本,而是报告
bash
中第一个出现的
$PATH
可执行文件的版本。

[注:OSX 10.10 (Yosemite) 是第一个将

/usr/local/bin
放置在系统路径之前的 OSX 版本,例如
/bin
中的
$PATH
。到 10.9 为止,系统路径排在第一位。因此,当OP问他的问题时,
bash --version
报告了系统的bash版本(
/bin/bash
),而不是Homebrew安装的版本(
/usr/local/bin/bash
)]

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

echo $BASH_VERSION

换句话说:您的 shell 很可能已成功更改 - 您的 test 有缺陷。


可以使用

chsh
更改当前用户的shell,如下所示:

[更新:切换为使用

/usr/local/bin/bash
和更高版本的
"$(brew --prefix)/bin"
(考虑到在 M1 Mac 及以上 Homebrew 根目录是
/opt/homewbrew
而不是
/usr/local
)而不是特定的版本化路径在
$(brew --prefix)/Cellar/bash/<version>/bin/bash
中,因为 Homebrew 会自动将符号链接保留在
$(brew --prefix)/bin/bash
指向最新安装的版本。向@drevicko致敬。]

# First, add the new shell to the list of allowed shells.
newShell="$(brew --prefix)/bin/bash"
sudo bash -c "echo \"$newShell\" >> /etc/shells"
# Then change to the new shell.
chsh -s "$newShell"

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

来自 @bmike 的额外提示:如果您想立即用新 shell 的实例替换 current 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 更改为$(brew --prefix)/bin/bash

,请使用:

sudo dscl . -change /Users/$USER UserShell /bin/bash "$(brew --prefix)/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
     命令指定的倒数第二个(倒数第二个)参数与 
    current
     属性值不匹配时,会发生此 
    -change 错误 - 这是一个确实奇怪的要求,即属性的指定当前值以便更改它。
虽然问题表明这两个条件都得到满足,但我怀疑由于实验,它们没有在“正确”的时间得到满足。

答案是,是的,我需要:

3
投票

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


    

当前版本的 iTerm2 允许进行更简单且侵入性较小的更改。在“首选项”>“配置文件”>“常规”中,在“命令”下将“登录 shell”更改为例如:

2
投票
/usr/local/bin/bash -l

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

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

之后 iTerm 和 Terminal 应该使用
/usr/local/bin/bash
作为新 shell。

chsh

dscl

以及“用户和组”首选项窗格全部修改 
/var/db/dslocal/nodes/Default/users/$USER.plist

假设仅希望更改 iTerm 使用的 shell(而不是用户的默认 shell),则从版本 3.4 开始可以使用以下简单的解决方案(请参阅

1
投票
):

在 iTerm 中,在 Preferences > Profiles > General > Command

下,从下拉列表中选择

Custom Shell,然后将所需 shell 的路径(例如 /usr/local/bin/bash)输入到“输入 shell 的完整路径”字段中以运行它作为登录 shell。

另请参阅 iTerm2 文档的
常规配置文件首选项

部分。

© www.soinside.com 2019 - 2024. All rights reserved.