Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何让iTerm使用brew显示的较新版本的bash?更改用户';OSX上的shell_Macos_Bash_Shell_Default_Homebrew - Fatal编程技术网

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