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

答え2

$mobile_app_api_urls / / /のRHSにsedに意味のある文字を含めないでください。特に、& # \ newline挿入する前に、この変数が適切にエスケープされていることを確認する必要があります。

答え3

変える:

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 "s#MOBILE_APP_API_URL#\"$mobile_app_api_url\"#g" \
  < app/index.html.mob >  MobileApp/www/index.html

上部セクションを次のように変更して、ksh93/に対する依存関係を削除することもできます。bash

environment=$1

case $environment in
  "") environment=beta;;
  live|beta) ;;
  *)
    printf >&2 'Invalid environment: "%s"\n' "$environment"
    exit 1;;
esac

また、見ることができますenvironment=${1:-beta}

[[ $environment =~ (live|beta) ]]ところで、ksh93テストbash$environment 含む liveまたはbeta必要に応じて聞こえません。[[ $environment =~ ^(live|beta)$ ]]大丈夫かどうかテストしてください。はい liveまたはbeta

関連情報