Shell-Script

使用 sed 命令參數與 GNU 和 BSD Unix 兼容(就地編輯)

  • August 4, 2021

我有一個 shell 腳本,目前用於移動應用程序的一些建構相關內容。

由於 BSD 和 GNU 之間的細微差別,最初在 Mac (BSD) 上編寫的建構腳本之一

environment=$1

if [[ -z $environment ]]; then 
 environment="beta"
fi
if ! [[ $environment =~ (live|beta) ]]; then
 echo "Invalid environment: $environment"
 exit 1
fi

mobile_app_api_url="https://api"$environment".mysite.com"

cp app/index.html.mob MobileApp/www/index.html

sed -i'' "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" MobileApp/www/index.html

sed 命令是在 BSD (Mac) 上編寫的,但由於建構可能在 Mac 或 Ubuntu (GNU) 上進行,我需要修改它以適用於這兩種風格,最好的方法是什麼?

這樣做是為了規避帶有以下-i標誌的有問題的可移植性問題sed

sed 'sed-editing-commands' thefile >tmpfile && mv tmpfile thefile

sed即,寫入臨時文件,然後如果命令沒有失敗,則將輸入文件替換為臨時文件。

sed這對於我所知道的所有實現都是可移植的。

要安全地創建臨時文件名,請使用mktemp. 雖然這不是標準實用程序,但它在我可以訪問的所有 Unices 上都可用(OpenBSD、NetBSD、Solaris、macOS、Linux):

tmpfile=$(mktemp)
sed 'sed-editing-commands' thefile >"$tmpfile" && mv "$tmpfile" thefile

引用自:https://unix.stackexchange.com/questions/348917