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/shells
と chsh
で変更した名前を使用しなければなりません。 古いターミナルウィンドウを閉じ、新しいターミナルウィンドウを開いて新しいシェルを取得するのが最善です。
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
レシピはそれを待つ必要があります。 (もし、他の誰かがそれに取り組みたいのであれば、ぜひそうしてください!)
。