2017-02-25 50 views
0

小小的先決條件:我在OS X上,隨附的bash版本是一些舊的3.x版本。由於我需要一些現代功能,我前段時間更新到4.x。OS X:root用戶的更新bash版本

我已經編寫了一個腳本,當以當前用戶身份執行時工作正常,但通過plist文件/ launchd以root身份運行時失敗。

這是因爲我顯然只更新了我的用戶的bash版本,而不是root。

我該如何更新root用戶的bash,並且安全嗎?

另一種選擇會導致只是使用指向我更新的bash版本的「自定義」shebang,但這似乎有點冒失,因爲它可以保證在其他系統上失敗。我也知道關於plist文件的UserName鍵,但不幸的是,當作爲我的用戶執行時,腳本不會調用事件(可能是我猜的一些路徑問題)。我希望bash更新會是更優雅的解決方案。

+0

不能保證你用'#!/ bin/bash'得到了什麼版本的'bash'; shebangs是爲了方便,而不是嚴格的便攜性。如果你想要可移植性,你可以用#!/ bin/sh來定位POSIX shell。否則根據需要按照每臺機器調整shebang。 – chepner

回答

1

macOS附帶bash v3在/ bin/bash中。你不應該試圖替換它(或/ bin,/ sbin,/ usr/bin或/ usr/sbin中的任何文件)。系統完整性保護將阻止它,並且重寫這是一個糟糕的主意。因此,使用#!/bin/bash的腳本應始終在bash v3下運行。

你可以做的一件事是創建/ usr/local/bin,在那裏安裝bash v4,然後使用#!/usr/bin/env bash的shebang。/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