コマンドの前にシェル変数を設定すると、「コマンドが見つかりません」が発生します。

コマンドの前にシェル変数を設定すると、「コマンドが見つかりません」が発生します。

シェル変数を設定し、それをシェルスクリプトの一部としてコマンドに渡したいのですが、コードは次のようになります。

SLS_DEBUG_TEXT=""
if [ "$ENABLE_DEBUG_LOGGING" = "true" ]; then
  SLS_DEBUG_TEXT="SLS_DEBUG=* "
fi

$SLS_DEBUG_TEXT sls create_domain -v $AWS_PROFILE_FLAG --stage $STAGE // gives error
#SLS_DEBUG=* sls create_domain -v $AWS_PROFILE_FLAG --stage $STAGE // works correctly

私が受け取ったエラーは次のとおりです。

./sls-deploy.sh: line 110: SLS_DEBUG_TEXT: command not found

このif説明はほとんど関係ありませんが、変数を条件付きに設定する必要があることを示したかったです(つまり、常にデバッグログを有効にしたくはありません)。コメントアウトされたコードスニペットの最後の行は、デバッグロギングが有効になって正しく機能するコマンドの外観です。

こことStack Overflowで変数を設定すると、等号の間のスペースが原因で問題が発生した以前の投稿がいくつか見つかりました(はい)しかし私はしませんでした。考える私はここでこの罠に陥った。

ご協力ありがとうございます。

ベストアンサー1

$SLS_DEBUG_TEXTシェルがその値を割り当てとして処理するステップの後、拡張は遅すぎます。したがって、変数の値はコマンドとして扱われます。

あなたができることは以下を使うことですenv

SLS_DEBUG_TEXT='SLS_DEBUG=*'
env "$SLS_DEBUG_TEXT" sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"

周囲の引用に注意してください各単一変数が拡張されます。

可能性が空であるか設定されていない場合、上記の場合は名前のないコマンドを試みるため、SLS_DEBUG_TEXTエラーが発生します。env

この問題を解決するには、次を使用できます。

SLS_DEBUG_TEXT='SLS_DEBUG=*'
env ${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"} sls create_domain -v "$AWS_PROFILE_FLAG" --stage "$STAGE"

変数が設定され、nullでない場合${SLS_DEBUG_TEXT:+"$SLS_DEBUG_TEXT"}に展開されます。"$SLS_DEBUG_TEXT"それ以外の場合は何も拡張されません(この場合は空の文字列も拡張されません"$SLS_DEBUG_TEXT")。

SLS_DEBUG_TEXT='SLS_DEBUG=* 'また、コードのように次のスペースがある場合は、*プロセス環境の値の一部になります。これが意図的なものかどうかはわかりません。SLS_DEBUGsls


私はまた、あなたが引用したエラーメッセージが次のように見えました。

./sls-deploy.sh: line 110: SLS_DEBUG_TEXT: command not found

私にとって、これは$変数名を使用する前に、変数名を使用せずにスクリプトのある時点で変数名を使用していることを意味します。これは、現在経験している主な問題とはまったく関係がない可能性があります。あなたのコード展示する代わりにエラーが発生します。

./sls-deploy.sh: line NNN: SLS_DEBUG=*: command not found

おすすめ記事