在OSX上将bash更新到版本4.0


81

是否可以在OSX Yosemite中将bash实际更新到版本4.0?

echo $BASH_VERSION
3.2.57(1)-release

文章,这线程指的是同样的问题,但他们安装一个新的外壳并排侧与旧的。有没有办法直接更新旧的bash shell?


3
不需要这样做。实际上,保留原始名称始终是一个好主意。可以同时安装两个或多个版本的bash,您可以将任意一个设置为默认值
lupincho 2015年

从本质上讲,Apple的软件更新将负责更改系统上BASH的版本,就像对Shellshock的BASH进行更新一样。因此,除非Apple提供更新,否则没有直接方法可以更新到OS X的一部分中安装的最新版本的GNU BASH。间接方法是自己通过一种或多种方式下载并安装并然后将其设置为默认外壳。是否选择删除出厂版本或Apple更新版本,由您决定。
user3439894

Answers:


36

苹果不会更新Bash,因为最新版本已获得苹果无法使用的GPLv3许可。他们已经更新了大多数其他外壳。例如ZSH大多是最新的。

参考文献:

经过一些研究,这似乎是主要问题:

当人们分发包含GPLv3下的软件的用户产品时,第6节要求他们向您提供修改该软件所需的信息。用户产品是许可证中专门定义的术语;用户产品的示例包括便携式音乐播放器,数字录像机和家庭安全系统。

这就要求否则开源软件必须将其GPL的部分由公众修改,这显然对Apple来说是个问题。


评论不作进一步讨论;此对话已转移至聊天
bmike

5
这种解释是没有道理的。交付GPL(v3或其他版本)二进制文件并不意味着将需要释放其余的OS。操作系统的其余部分未链接bash。“ Tivoization”子句可能解释了为什么bash不能在Apple TV上进行更新,而不能在台式Mac上进行更新。此外,“ GPL的部分”已经需要由公众修改;v3不会改变这一点。我相信 GPL v3 的专利条款足以阻止Apple接触GPL v3代码。
jamesdlin

为什么这对Apple来说是个问题?Bash已经开放源代码(所有版本≥1.14的版本都可以通过GNU @ ftp.gnu.org/gnu/bash获得,而macOS随附的版本(当前为v3.2)可以通过Apple @ opensource.apple.com/source/bash获得。),但无论如何都可以对其进行修改。
声音

@ tjt263这与GPLv3和GPLv2之间的差异有关,Apple使用的版本仍获得许可。
William T Froggard

3
正确,Bash3.2是根据GPLv2许可的。Bash4.x是根据GPLv3许可的。所以呢?您说:“ Apple不会更新Bash,因为最新版本已获得GPLv3的许可,Apple无法使用。” 他们为什么不能呢?“这将要求开源软件,否则其GPL的部分必须由公众修改,这显然对Apple来说是个问题。” 为什么这是一个问题?他们已经做到了。它已经可以被公众修改。所有软件都是。尤其是当它是FOSS时,他们会将自己网站上的源代码提供给任何想要的人。
声音

62

是否可以在OSX Yosemite中将bash实际更新到版本4.0?是。

  1. 通过在终端中运行此命令来下载/安装homebrew http://brew.sh/

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. 退出并重新打开您的终端。然后输入

    brew install bash
  3. 通过终端GUI更改默认shell,并使用新bash的文字路径(编辑:我尚未找到可以使用的CLI方式)

在此处输入图片说明

是否有可能在OSX Yosemite中将bash实际更新为Apple提供的bash版本4.0?

编辑:不。不以op询问的方式。例如,通过替换自身来升级当前安装。在其他答案中指出,由于许可问题,Apple尚未更新bash。但是,对于大多数解释器而言,下载bash的更新且单独的版本并将其用作您的默认Shell是一种规范的解决方案。以python为例。您没有将2.7升级到3.5,而是下载了单独的版本并更改了默认值。


12
您可以通过设置使用CLI默认:sudo chpass -s /usr/local/bin/bash。注意:最好以/usr/local/bin/这种方式指向符号链接,Brew可以处理升级而不必每次都更改环境。
sansSpoon

3
使用非Apple外壳会有什么风险?
约克一号球迷

5
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'然后chsh -s /usr/local/bin/bash将设置终端的默认外壳
Abhijit Sarkar

51

正如@William在回答中所说,由于GPL限制,Apple不提供bash 4。但是,您可以安装bash 4+,也可以通过执行以下操作将其设置为默认外壳程序(包括Terminal和iTerm2)。

通过Homebrew安装Bash 4

首先安装较新版本的bash。有多种方式可以做到这一点,我更喜欢Homebrew。

Bash 4现在在您的PATH上可用(假设Homebrew bin在您的路径上)。但是,它还不是您的默认Shell。您可以通过运行找到它的位置which bash。以我为例/usr/local/bin/bash

使用重击4

由于它在您的PATH上,因此您可以使用just启动Bash 4会话,bash也可以通过使用Shebang在脚本中使用它。

例如,这将使用特定的bash实例。

#!/usr/local/bin/bash
...your script...

这将使用PATH上的第一个bash。

#!/usr/bin/env bash
...your script...

您还可以使用@ user136952的答案中所述的步骤,在Terminal / iTerm2中为特定配置文件设置bash路径。

将Bash 4设为默认

如上所述,安装Bash 4之后仍然不是默认的Shell。要将bash设置为默认值,您需要再执行两个步骤。

首先,将Bash 4路径添加到您的/etc/shells文件,以便它是允许的登录shell。如/ etc / shells中所述,此文件包含有效登录shell的列表。添加新的bash路径后,我/etc/shells将如下所示:

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/bash

接下来,我们使用chsh使其成为您的默认外壳。因此,该用户的任何会话都将使用该shell。您可以在Mac OS X Terminal中的“ 更改外壳”中阅读有关此内容的更多信息,但实际命令非常简单。

chsh -s /usr/local/bin/bash

现在,新的bash是我们的默认登录shell。如果打开Terminal或iTerm2并运行,bash --version您应该会看到新版本。请注意“许可证GPLv3 +”,这就是Apple不将其与macOS捆绑在一起的原因。

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.6.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

2
根据他的文章/主题,我认为他的意思是“不违约”,并不是说并排。我的答案将默认值设为4,因此不再显示3。在我看来,旧的bash恰好仍在占用一些磁盘空间这一事实似乎并不重要。
studgeek

1
由我+1。是的,OP不想这样做,但是问题属于社区,如果这对其他人有帮助,那就太好了。作为OP选择的答案,它可能不会得到检查,但这并不是一个不好的答案。
bmike

3
在High Sierra上,仅sudo chpass -s /usr/local/bin/bash将我的shell更改为root / sudo 要更改常规登录名,我必须运行不带的命令sudo。这可能是Active Directory的事情;我不确定。
Bradd Szonye,

1
不要使用#!/usr/local/bin/bashshebang,而要使用using #!/usr/bin/env bash解释)。这将以启动脚本的环境可以访问的任何bash版本(即which bash返回的任何值)运行脚本。这是使用特定路径的更可移植的解决方案。我们不能期望其他用户通过自制软件安装bash。
伊利亚·莫斯科夫

1
@IllyaMoskvin,我最初使用的是特定路径,因为我想展示如何显式使用它。我已经更新了两个示例。
studgeek

0

您可以安装没有自制软件的其他Bash版本

  • 转到GNU Bash
  • 下载所需版本(此处
  • 并按照此处的步骤操作:https : //gist.github.com/samnang/1759336

    下载并安装所需的bash版本将XX(在bash-XX中)替换为所需的版本,例如4.4

    curl -O http://ftp.gnu.org/gnu/bash/bash-X.X.tar.gz
    tar xzf bash-X.X.tar.gz
    cd bash-X.X
    ./configure --prefix=/usr/local && make && sudo make install

    将新外壳添加到合法外壳列表中

    sudo bash -c "echo /usr/local/bin/bash >> /private/etc/shells"

    更改用户的外壳

    chsh -s /usr/local/bin/bash

    检查Bash 4和/ usr / local / bin / bash ...

    echo $BASH && echo $BASH_VERSION

    如果希望bash命令使用别名,则可能需要添加别名。放在您的〜/ .bash_profile中

    alias bash="/usr/local/bin/bash"

-1

通过脚本(通过chsh或GUI)对shell进行更新的并行安装将失败。脚本经常使用env bash,它还原为OS X bash版本。因此,您想要的不是bash的完整更新,而是并行安装,该安装始终返回bash的较新版本(即,即使env被调用)。

因此,要处理此问题:

1)通过Homebrew安装bash,如其他评论者所述

2)将您的登录Shell设置为此新版本(通过其他人发布的GUI或chsh命令)

3)在$ PATH变量/usr/local/bin之前设置(或新bash版本的路径)/bin,方法是将其添加到您的~/.bash_profileexport PATH=/usr/local/bin:$PATH


这将破坏期望使用bash版本3的脚本-即Apple提供的脚本-您需要并排使用sde
user151019 2018年

一个公平的观点。像这样运行了一段时间,没有问题。也许苹果公司在其脚本中提供了完整的路径,或者只是没有遇到障碍。对于Apple系统级脚本(即不是从外壳程序执行),.bash_profile无论如何都不会调用,因此无论如何它只会影响您直接在终端中运行的内容。
cwingrav

2
@Mark我想不出一个实例,其中v≥4.x会破坏为v≤3.x编写的脚本。你是否可以?
声音

-1

2019:就像这篇文章一样简单

$ brew install bash
$ sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
$ chsh -s /usr/local/bin/bash

然后选择一个新的终端,尽情享受吧!


1
谁在没有解释的情况下否决了我的答案?
Feuda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.