macOSのデフォルトのbashはまだbash v3です:

$ bash --versionGNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)Copyright (C) 2007 Free Software Foundation, Inc.

つい最近、bash v5がリリースされました。 この矛盾は、bash がバージョン 4 から GPL v3 としてライセンスされていることに起因しています。 Apple は GPL v3 でライセンスされたツールを macOS に同梱していません。

しかし、最新の bash バージョンをダウンロードしてインストールすることを妨げるものは何もありません。

新機能には、多くのものの中で、関連する配列 (すなわち辞書) とより優れた自動補完のセットアップがあります。

これは一般的な要望だと思われますが、私が見つけたほとんどのページでは、新しい bash バージョンをダウンロードしてインストールするために Homebrew を指すだけです。

brewを使う際の主な課題は、MacAdmin が必要とするスケールで機能しないことです。 brew はシングルユーザーでのインストール用に設計されており、ユーザーは管理者権限を持っています。 brew のワークフローは、管理システムで制御された大規模なデプロイメントにはスケールしません。

理想的には、最新の bash バージョン用のパッケージインストーラがあるはずです。

この投稿では、brew なしで最新の bash バージョンをインストールする方法と、デプロイのためのインストーラー パッケージを構築する方法を紹介します。

手動インストール

これには、Xcode または Developer Command Line Tools をインストールする必要があります。 この記事を書いている時点では、最新バージョンは bash-5.0 であり、あなたが欲しいファイルは bash-5.0.tar.gz です。 ダウンロードしたら、Finder でダブルクリックしてアーカイブを展開します。

Update: bash 5.0 へのパッチを含む、いくつかの更新された手順の投稿があります。

ターミナルウィンドウを開き、新しく展開した bash-5.0 ディレクトリにディレクトリを変更します。

$ cd ~/Downloads/bash-5.0$ ./configure

この configure プロセスにはしばらく時間がかかり、進捗を示すメッセージがたくさん表示されます。 make コマンドで bash をビルドできます。

$ make

これにより、bash バイナリとサポートファイルがカレントディレクトリにビルドされます。 最終的に必要なのはそこではありませんが、ビルドプロセスがうまくいくかどうかを確認するのはおそらく良いアイデアでしょう。 これには (やはり) 時間がかかります。

make が成功したら、bash v5 を実際にインストールできます。

$ sudo make install

これは bash バイナリとサポートファイルを /usr/local/bin/usr/local にビルドしてインストールするものです。 sudo/usr/local を変更するのに必要です。

もしあなたが brew なしで bash v5 をインストールする方法を探していただけなら、これで終わりです!

しかし、記事の残りの部分にもっと役に立つ情報がありますので、読み続けてください!

How the new and the old bash interact

By default, the bash v5 binary is called bash and will be installed in /usr/local/bin….あなたは をインストールし、brew をインストールし、bash バイナリをインストールします。 macOS のデフォルトの PATH は、/usr/local/bin を、同じく bash と呼ばれるデフォルトの bash v3 バイナリが配置されている /bin よりも先にリストアップします。

これは、ユーザーがシェルに bash と入力すると、/usr/local/bin にあるバージョンが、プリインストールされている bash v3 よりも優先されることを意味しています。 デフォルトのシェルはまだ /bin/bash から変更されていないので、Terminal はまだ bash v3 を開いています。 環境変数 BASH_VERSION を表示することでテストできます:

$ echo $BASH_VERSION3.2.57(1)-release

しかし、bash を実行すると /usr/local/bin/bash が呼び出され、新しい bash v5 が実行されます。プロンプトにこれが表示されますが、 BASH_VERSION.

$ bashbash-5.0$ echo $BASH_VERSION5.0.0(2)-release

これは、bash v5 を常に使用したい場合の設定方法かもしれません。

この曖昧さを避けるための一つの選択肢は、/usr/local/bin のバイナリを bash5 にリネームすることです。 しかし、その場合、env (後述) のような他のツールはバイナリを見つけることができなくなります。

  • Scripting OS X: PATH はどこから来るのか

Note: 他の文脈における PATH は、おそらく /usr/local/bin を含まず、さらに問題を混乱させます。

bash v5 とスクリプト

bashを使うスクリプトは、バイナリへのフル パスを shebang で持つべきでしょう。 こうすることで、スクリプトの作者はスクリプトがデフォルトの bash v3 (/bin/bash) と新しい bash v5 (/usr/local/bin/bash または /usr/local/bin/bash5) のどちらで実行されるかを制御できる。

shebang で env コマンドを使うことがよく推奨されている:

#!/usr/bin/env bash

env コマンドは現在の環境における bash バイナリへの道を決定します。 (すなわち、現在の PATH を使用する) これは、bash バイナリの場所が不明な様々な環境、言い換えれば複数の Unix や Unix-like プラットフォームでスクリプトを実行しなければならない場合に有用である。

例えば、デフォルトの設定で bash v5 がインストールされていると仮定する (/usr/local/bin/bash として)。 ユーザー環境 (すなわちターミナル) で起動された shebang #!/usr/bin/env bash を持つスクリプトは、検索順で /usr/local/bin/bin より前に来るので、より新しい bash を使用します。

別のコンテキスト、たとえばインストールスクリプト、AppleScript、管理システムとして同じスクリプトを起動すると、/usr/local/bin はその環境の PATH に含まれていない可能性があります。 その場合、env シバングは /bin/bash (v3) を選択することになります。 スクリプトは解釈され、異なる動作をするかもしれません。

管理者は、管理された環境において確実性を好みます。 管理者はシステム上のバイナリの場所とバージョンを知っている必要があります。 管理スクリプトでは、envを避け、目的のインタプリタ・バイナリへの適切なフルパスを使用する必要があります。

この曖昧さを解決するための解決策は、

  • shebang でバイナリへのフルパスを使用する
  • 管理し、bash の追加カスタム バージョンを更新することであり、これは、曖昧さを解決するためのものです。 管理システム
  • (オプション)新しい bash バイナリの名前を bash5 または bash4 に変更します(これにより、bash v4 と bash v5 を同じシステムで使用できるようにもなります)
  • Scripting OS X.NET、
  • bash v4 と bash v5 を同じシステムで使用します。 Shebang について
  • Scripting OS X: スクリプトで PATH を設定する

Changing a user’s default Shell to bash v5

bash v5 をインストールしても、新しいターミナル ウィンドウのデフォルト シェルは、組み込みの bash v3.

デフォルト シェルへのパスはユーザー レコードに保存されています。

デフォルトシェルを設定するコマンドもあります:

$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: chsh: /usr/local/bin/bash: non-standard shell

chsh (change shell) コマンドは、/etc/shells ファイルで許可されているシェルをチェックします。

$ chsh -s /usr/local/bin/bashChanging shell for armin.Password for armin: 

注意: bash バイナリの名前を変更する場合、/etc/shellschsh で変更した名前を使用しなければなりません。 古いターミナルウィンドウを閉じ、新しいターミナルウィンドウを開いて新しいシェルを取得するのが最善です。

Packaging bash v5 for mass deployment

単一の Mac に bash v5 をインストールし設定するこれらのステップは十分にシンプルですが、何百、何千もの Mac に対する管理システムではうまく機能しないでしょう。

configure スクリプトの --help オプションから、次のような有用な情報が得られます:

By default, make install' will install all the files in/usr/local/bin,/usr/local/libetc. You can specify an installation prefix other than/usr/localusing-prefix, for instance-prefix=$HOME`.BIN/USR_LIB_LIB_LIST_LIST_LIST_LIST=$HOME`.BIN/USR_LIB_LIST_LIST=$HOME`.BIN/USR_LIB_LIST_LIST_LIST_LIST=$HOME`.

confure スクリプトを --prefix オプションで実行すると、パッケージインストーラのペイロードとして適したフォルダーが作成されます。

$ cd ~/Downloads/bash-5.0$ mkdir payload$ ./configure --prefix=/Users/armin/Downloads/bash-5.0/payload$ make install$ pkgbuild --root payload --install-location /usr/local --identifier org.gnu.bash --version 5.0 bash-5.0.pkgpkgbuild: Inferring bundle components from contents of payloadpkgbuild: Wrote package to bash-5.0.pkg

(注意: --prefix 引数は絶対パスが必要です。) pkgbuild を使用してビルドすると、インストーラ pkg が作成されます。)

パッケージ作成を自動化する

これで、bash v5 を配布および設定するためのインストーラーパッケージを構築するワークフローが完成しました。

  • アーカイブをダウンロードする
  • アーカイブを展開する
  • run configure with the --prefix argument
  • run make install to create the files in a payload folder
  • optional.Of .NET Framework 2.0 を起動する
  • アーカイブを展開する
  • 展開されたアーカイブは、--prefix引数でに渡されます。 競合を避けるため、結果の bash バイナリを bash5 にリネームする
  • /usr/local/bin/bash がまだ存在しない場合は /etc/shells に追加する postinstall スクリプトを追加する
  • build the installer with pkgbuild

このワークフローは自動化に適したものと思われるでしょう。 スクリプトはこのリポジトリから入手できます。

スクリプトの引数として、例えば 4.4.18 のように異なる (有効な) bash バージョン番号を渡すことができます。 (著しく古いものはテストしていません。) スクリプトは最新バージョンを自動検出せず、引数が与えられない場合はバージョン 5.0 をデフォルトとします。 bash v5 へのアップデートが公開されたら、バージョン行を修正するか、引数を指定してスクリプトを実行する必要があります。

ダウンロード Web ページから最新バージョンを検出する方法は (まだ) 理解していません。 autopkg レシピはそれを待つ必要があります。 (もし、他の誰かがそれに取り組みたいのであれば、ぜひそうしてください!)

コメントを残す

メールアドレスが公開されることはありません。