web-dev-qa-db-ja.com

変数をインラインシェルスクリプトに送信する方法は?

次のスクリプトを実行します。

VAR="Test"
sh -c 'echo "Hello $VAR"'

しかし私は得る:

# ./test.sh
Hello

スクリプトの変数VARsh -c '...'で作成したシェルに送信するにはどうすればよいですか?

27
Matthieu Napoli

exportを使用して環境変数に変換するか、コマンドに直接渡します。

VAR="Test" sh -c 'echo "Hello $VAR"'

VAR="Test"
export VAR
sh -c 'echo "Hello $VAR"'

次のようなコマンドインジェクションの脆弱性が生じるため、シェルコードを二重引用符で囲んで補間を許可しないでください。

sh -c "echo 'Hello $ VAR'"

$VAR';reboot #のようなものが含まれている場合に呼び出された場合に再起動を引き起こす

変数をsh -cに(位置引数として)渡す別の方法を次に示します。

{
VAR="world"
VAR2='!'
sh -c 'echo "Hello ${0}${1}"' "$VAR" "$VAR2"
}
9
ben

それらを環境変数としてエクスポートしたくない場合は、次の方法で実行できます。 variabe定義をファイルに保存します.var_init.shそして次のようにあなたのサブシェルでそれを調達します:

。var_init.sh

VAR="Test"

コマンドラインから:

sh -c ". .var_init.sh && echo \$VAR" # Make sure to properly escape the '$'

この方法では、サブシェルの実行時にのみ変数を設定します。

5
rahmu

Sudo sh -cを使用している場合、環境変数は 渡されない ですが、--preserve-env引数を使用することで回避できます。

export VAR="test for exporting"
Sudo --preserve-env=VAR sh -c 'echo "This is a $VAR"'

これは、環境変数のセット全体を渡すSudo -Eを使用するのではなく、必要な変数だけを渡します。から Sudo Manual

--preserve-env = listセキュリティポリシーに対して、ユーザーが環境変数のコンマ区切りリストをユーザーの環境から保存されたものに追加することを希望していることを示します。ユーザーが環境を保持する権限を持っていない場合、セキュリティポリシーはエラーを返すことがあります。

または、次のように直接割り当てることもできます。

export VAR="test for exporting"
Sudo VAR1="VAR" sh -c 'echo "This is a $VAR1"'
0
enharmonic