Shell-Script
使用 sed 命令參數與 GNU 和 BSD Unix 兼容(就地編輯)
我有一個 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