2017-02-25 18 views
0

小規模な前提条件:私はOS X上にあり、古いバージョン3.xと一緒に出荷されるbashバージョンです。私はいくつかの現代的な機能を必要としていたので、しばらく前に4.xにアップデートしました。OS X:rootユーザー用のbashバージョンを更新してください

私は、現在のユーザーとして実行するとうまく動作するスクリプトを作成しましたが、plistファイル/ launchdを通じてrootとして実行すると失敗します。

これは私が明らかにrootユーザーではなく自分のユーザーのbashバージョンのみを更新したためです。

rootユーザのためにbashを更新するにはどうしたらいいですか?

もう一つのオプションは、私の更新されたbashバージョンを指し示す "カスタム"シバンを使用することです。しかし、これは他のシステムでは失敗することがあるので少しハッキリです。

plistファイルのキーについては、UserNameも知っていますが、残念ながら私のユーザーとして実行すると、スクリプトはイベントが呼び出されません。 bashの更新がより洗練されたソリューションになることを期待していました。

+0

'#!/ bin/bash'でどのバージョンの' bash'を取得するかは保証できません。シバンは便宜のためであり、厳密な移植性ではありません。移植性を望むなら、 '#!/ bin/sh'でPOSIXシェルをターゲットにします。それ以外の場合は、必要に応じてマシン単位でシバンを調整します。 – chepner

答えて

1

MacOSには、/ bin/bashにbash v3が付属しています。これ(または/ bin、/ sbin、/ usr/bin、または/ usr/sbin内のファイル)を置き換えないでください。システム・インテグリティ・プロテクションはそれを防ぎ、それを無効にすることは悪い考えです。結果として、#!/bin/bashを使用するスクリプトは常にbash v3で実行する必要があります。

あなたができることは、/ usr/local/binを作成し、そこにbash v4をインストールしてから、shebangを#!/usr/bin/env bashにすることです。デフォルトでは存在しないにもかかわらず、/ usr/local/binがmacOSのデフォルトパスに最初にリストされているので、shebangはすべてのアカウントで新しいbashを使うべきです。

v4の機能を使用する前に、バージョンチェックをスクリプトに追加します。このようなもの:

if [ "${BASH_VERSINFO:-0}" -lt 4 ]; then 
    echo "This script ($0) requires bash version 4 or later" >&2 
    exit 1 
fi 
関連する問題