Bash - 引数は出力時にbashを解析しないでください。

Bash - 引数は出力時にbashを解析しないでください。

2つのシェルスクリプトがあります。最初は2番目をトリガーし、いくつかのパラメータを追加します。 2番目のスクリプトはコマンドを呼び出し、最初のスクリプトのパラメータをコマンドの引数として追加します。

最初のものは次のとおりです。

#!/usr/bin/env bash

ADDITIONAL_ARGUMENTS='--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'

SUPER_PARAMS=${ADDITIONAL_ARGUMENTS} my_second_script.sh

次に、2番目のスクリプトは次のことを行います。

#!/usr/bin/env bash

randomBinary --some-hardcoded-parameters \
             "${SUPER_PARAMS}"

私が期待する結果は次のとおりです。

randomBinary --some-hardcoded-parameters --set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"

しかし、代わりに呼び出しは次のようになります。

randomBinary --some-hardcoded-parameters '--set "args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}"'

パラメータを正しく引用しようと2日間試しましたが、結果はありません。

ベストアンサー1

複数のパラメータを保存するには、スカラー変数の代わりに配列を使用します。

additional_arguments=(
  --set
  'args={/bin/bash,-c,cd /var/www && sudo -u www-data bash scripts/system/update.sh}'
)
randomBinary --some-hardcoded-parameters "${additional_arguments[@]}"

環境変数はNULではなくバイトの文字列なので、配列定義を環境を介して他のコマンドに渡すには、いくつかのエンコーディングが必要です。

kshbashまたは以下zshyash使用できます。

ARRAY_DEFINITION="$(typeset -p additional_arguments)" my_second_script.sh

配列定義を呼び出しスクリプトの環境変数にエクスポートします。

そしてeval "$ARRAY_DEFINITION"呼び出しスクリプトで輸入配列定義。

コードが生成されたロケールと同じロケールで同じシェルを使用してコードを評価することが重要です。

また、配列定義が関数内で評価される場合、配列はその関数に対してローカルになります。

一部のシェルは配列のエクスポート(内部で独自のエンコーディングを使用)を優先またはrc許可します。esfish

ここでは、情報を呼び出されたスクリプトにパラメータとして渡すのが配列であるため、簡単になります。

呼び出しスクリプトから:

my_second_script.sh "${additional_arguments[@]}"

呼び出しスクリプトから:

randomBinary --some-hardcoded-parameters "$@"

または、呼び出し側のシェル変数を共有するために呼び出されたスクリプトを呼び出すと、.実行中にそのデータを渡すために環境を使用する必要はありません。

おすすめ記事