sed コマンド引数を使用して GNU および BSD Unix と互換性があります。

sed コマンド引数を使用して GNU および BSD Unix と互換性があります。

現在、モバイルアプリの一部のビルド関連タスクに使用しているシェルスクリプトがあります。

BSDとGNUの微妙な違いにより、もともとMac(BSD)で書かれたビルドスクリプトの1つです。

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)にある可能性があるため、両方のバージョンで動作するように変更する必要があります。最良の方法は何ですか?

ベストアンサー1

-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

おすすめ記事