是否可以在OSX Yosemite中将bash实际更新到版本4.0?
echo $BASH_VERSION
3.2.57(1)-release
是否可以在OSX Yosemite中将bash实际更新到版本4.0?
echo $BASH_VERSION
3.2.57(1)-release
Answers:
苹果不会更新Bash,因为最新版本已获得苹果无法使用的GPLv3许可。他们已经更新了大多数其他外壳。例如ZSH大多是最新的。
参考文献:
经过一些研究,这似乎是主要问题:
当人们分发包含GPLv3下的软件的用户产品时,第6节要求他们向您提供修改该软件所需的信息。用户产品是许可证中专门定义的术语;用户产品的示例包括便携式音乐播放器,数字录像机和家庭安全系统。
这就要求否则开源软件必须将其GPL的部分由公众修改,这显然对Apple来说是个问题。
bash
。“ Tivoization”子句可能解释了为什么bash
不能在Apple TV上进行更新,而不能在台式Mac上进行更新。此外,“ GPL的部分”已经需要由公众修改;v3不会改变这一点。我相信 GPL v3 的专利条款足以阻止Apple接触GPL v3代码。
是否可以在OSX Yosemite中将bash实际更新到版本4.0?是。
通过在终端中运行此命令来下载/安装homebrew http://brew.sh/。
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
退出并重新打开您的终端。然后输入
brew install bash
通过终端GUI更改默认shell,并使用新bash的文字路径(编辑:我尚未找到可以使用的CLI方式)
是否有可能在OSX Yosemite中将bash实际更新为Apple提供的bash版本4.0?
编辑:不。不以op询问的方式。例如,通过替换自身来升级当前安装。在其他答案中指出,由于许可问题,Apple尚未更新bash。但是,对于大多数解释器而言,下载bash的更新且单独的版本并将其用作您的默认Shell是一种规范的解决方案。以python为例。您没有将2.7升级到3.5,而是下载了单独的版本并更改了默认值。
sudo chpass -s /usr/local/bin/bash
。注意:最好以/usr/local/bin/
这种方式指向符号链接,Brew可以处理升级而不必每次都更改环境。
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'
然后chsh -s /usr/local/bin/bash
将设置终端的默认外壳
正如@William在回答中所说,由于GPL限制,Apple不提供bash 4。但是,您可以安装bash 4+,也可以通过执行以下操作将其设置为默认外壳程序(包括Terminal和iTerm2)。
首先安装较新版本的bash。有多种方式可以做到这一点,我更喜欢Homebrew。
brew install bash
。Bash 4现在在您的PATH上可用(假设Homebrew bin在您的路径上)。但是,它还不是您的默认Shell。您可以通过运行找到它的位置which bash
。以我为例/usr/local/bin/bash
。
由于它在您的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之后仍然不是默认的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>
sudo chpass -s /usr/local/bin/bash
将我的shell更改为root / sudo 。要更改常规登录名,我必须运行不带的命令sudo
。这可能是Active Directory的事情;我不确定。
您可以安装没有自制软件的其他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"
通过脚本(通过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_profile
:export PATH=/usr/local/bin:$PATH
.bash_profile
无论如何都不会调用,因此无论如何它只会影响您直接在终端中运行的内容。