如何在 Mac OS X 上获取 Bash 4.3 功能?

如何在 Mac OS X 上获取 Bash 4.3 功能?

在 El Capitan 10.11.5 中,Bash 版本是:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.

如何使用/安装 Bash 4.3 以利用下面列出的功能?

如何获得彩色的标签补全?

答案1

注意:这实际上不是一个困难的过程。只是有很多文字。根据您的系统,总共可能需要大约 2 分钟或更少的时间。您几乎可以按顺序复制/粘贴这些命令。通常只需更改全部大写的内容即可。

前几天我刚刚为 macOS 10.12.x 做了这个。我选择了 v4.3.30,因为看起来 v4.4 仍在测试中,或者最近才完成。

从源头下载它(本例中为 v4.3.30):http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz

下载完 bash 后,如果您愿意在 ~/Bin 中安装(这是我的建议;您可以随时稍后移动它),则可以按顺序运行这些命令。否则,我会指出您可以在哪里更改它。所有以“#”为前缀的内容都是注释,因此不要在命令行中输入它!

    # Unpack the archive.
    tar zxvf ~/Downloads/bash-4.3.tar.gz 
    # Change into the directory (of the unpacked archive).
    cd ~/Downloads/bash-4.3/
    # Create a directory to store some of your user programs.
    mkdir ~/Bin
    # Run configure which will gather info. about the installation 
    #+ environment. Optionally, you can include the --prefix option along
    #+ with an argument for the install location. If you'd like to install  
    #+ elsewhere, use --prefix and the location of your choosing.
    ./configure --prefix ~/Bin
    # Compile the source code.
    make
    # Install the compiled program. 
    # Note: You can do without sudo since you're installing locally.
    sudo make install

就是这样。bash 现已安装。 然而...您应该了解以下几件事:

您的系统上现在安装了两个不同版本的 bash。这完全没问题。它甚至对测试和向后兼容性来说也是可取的。这就是我正在做的事情,我打算继续下去。这就像在你的系统上有一个不同名称的 shell,比如 zsh、sh、csh 等。

需要注意的是,当你启动终端应用程序并打开新 shell 时,你的默认 shell 仍然是旧的 bash,除非你更改它(更多内容见下文)。要启动新的 bash,你不能只输入命令bash因为 bash 将查看你的 PATH 变量并沿着列表尝试查找 bash,并且它很可能会在找到你的新 bash 之前找到 /bin/bash,尤其是因为新的 bash 可能(如果你听从我的建议)在一个名为 ~/Bin 的文件夹中,而该文件夹甚至还不是你的 PATH 的一部分。

因此,此时,如果您想从命令行运行 bash-4.3.30,请输入完整路径,将 USERNAME 替换为您的主目录的名称:/Users/USERNAME/Bin/bash/bin/bash然后您可以执行bash --version并说:“嘿,什么鬼!为什么我还在运行旧版 bash?”那是因为您调用了旧版 bash!再次,输入命令 bash 很可能会解析为 /bin/bash。那么,我们如何解决这个问题?或者,至少,我们如何才能看到我们实际上正在运行 bash-4.3.30?

如果你想知道从命令行运行的是哪个 shell,请执行以下操作:echo $0

$0 是 bash 的一个特殊参数,用于存储正在执行的进程的名称,在本例中为 bash-4.3.30(代表您执行命令的进程,通常为您执行其他程序)。现在,要查看版本,请输入要解释该参数的正确程序的完整路径,即新的 bash-4.3.30,它与您刚从 echo 返回的 $0 的值相同。那么,请这样做:/Users/USERNAME/Bin/bash/bin/bash --version看看有何不同。这可能看起来很奇怪,但您现在正在运行 bash-4.3.30,但您将其作为 /bin/bash(旧版 bash)中的子进程运行。现在输入exit,您将退出 bash4.3.30 并返回旧版 bash。exit再次输入,您很可能会关闭终端窗口并注销 shell 会话。

现在,您有几种不同的选择来使用 bash-4.3.30,而不必每次启动它时都输入完整路径。

如果您想默认运行 bash-4.3.30,您可以在 Terminal.app 中更改默认登录 shell:首选项...> 常规> 打开方式 > ...将其更改为默认登录 Shell,然后输入 bash-4.3.30 的新完整路径,将 USERNAME 更改为您的主目录的名称:/Users/USERNAME/Bin/bash/bin/bash

如果你仍然希望在登录时运行旧的 bash,但又不想记住路径,那么启动新的 bash 会更容易一些,您可以创建一个别名并将其附加到您的 ~/.bashrc:echo 'alias bash4="/Users/USERNAME/Bin/bash/bin/bash"' >> ~/.bashrc这样,您只需在命令行中输入 bash4 即可调用 bash-4.3.30。

或者,您可以将新 bash 的位置添加到 PATH 变量中。如果您将其作为前缀而不是附加,则bash从命令行调用时应该会得到 bash-4.3.30:

    # Prefix ~/Bin/bash/bin/ to your PATH variable:
    PATH="~/Bin/bash/bin:${PATH}"
    # Save it by changing it in your ~/.bashrc
    echo 'export PATH="$PATH"' >> ~/.bashrc

如果您不确定正在运行哪个 bash,请记住这样做echo $0。我不建议重命名新的或旧的 bash。这可能会导致不良后果。不过,我在我的系统上做了这个测试(它需要 sudo)。这就是你学习的方式!而且,现在你总是可以依靠旧的 bash,而且你知道如何从源头重新构建一个新的 bash,如果需要的话。

答案2

您可以使用包管理器(Homebrew、MacPorts、Fink、Nix、Rudix 等)来安装 Bash 二进制文件,或者如果您不使用包管理器并且不想安装包管理器,则可以从源代码进行编译。

Homebrew、MacPorts 和 Nix 的 Bash 软件包 >= Bash v4.3。我不确定其他软件包管理器。如果您不想通过软件包管理器安装,您可以下载 Bash 4.3 源代码,然后编译它。如果您不确定如何执行此操作,请随时向我寻求帮助。我很乐意与您一起完成整个过程。(编辑GH05T 的回答详细说明如何从源代码进行编译)

相关内容