Sshを使用してマシンからコマンドを実行し、環境変数$BUILD_NUMBER
を渡すことができるようにしたい
私がしようとしているものは次のとおりです。
ssh [email protected] '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
はssh呼び出しを行うマシンで設定され、変数はリモートホスト上に存在しないため、取得されません。
$BUILD_NUMBER
の値を渡すにはどうすればよいですか?
使用する場合
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
の代わりに
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
シェルは、コマンド文字列をリモートホストに送信する前に$BUILD_NUMBER
を補間します。
単一引用符で囲まれた変数は評価されません。二重引用符を使用します。
ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"
シェルは変数を二重引用符で展開しますが、単一引用符では展開しません。これは、ssh
コマンドに渡される前に、目的の文字列に変更されます。
(この答えは不必要に複雑に見えるかもしれませんが、私が知っている限り、空白や特殊文字に関しては容易に拡張可能で堅牢です。)
ssh
コマンドの標準入力と、リモートロケーションからのread
を介してデータを直接フィードできます。
次の例では、
ssh
に、変数の名前と値を示すヌル終了行を与えます。shh
コマンド自体では、これらの行をループして必要な変数を初期化します。# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb
# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
FOO
BAR
)
for name in "${VAR_NAMES[@]}"
do
printf '%s %s\0' "$name" "${!name}"
done | ssh [email protected] '
while read -rd '"''"' name value
do
export "$name"="$value"
done
# Check
printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'
出力:
FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]
それらをexport
する必要がない場合は、declare
の代わりにexport
を使用できるはずです。
本当に簡略化されたバージョン(拡張性が必要ない場合、処理する変数が1つだけなど)は次のようになります。
$ ssh [email protected] 'read foo' <<< "$foo"
前述のように、リモートホストで環境変数を設定する必要はありません。代わりに、ローカルホストでメタ拡張を実行し、リモートホストに値を渡すことができます。
ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'
本当にリモートホストで環境変数を設定して使用したい場合は、env
プログラムを使用できます。
ssh [email protected] "env BUILD_NUMBER=$BUILD_NUMBER ~/tools/run_pvt.pl \$BUILD_NUMBER"
この場合、これは少しやり過ぎです。
env BUILD_NUMBER=$BUILD_NUMBER
はローカルホストでメタ拡張を行いますBUILD_NUMBER
環境変数は