2017-01-04 13 views
0

私はBashのHeredoc構文に深く混乱しています。 /home/some_user/check.txt:そのようなファイルやディレクトリはありませんHeredoc、Bashにそのようなファイルやディレクトリがありません

#!/bin/bash 
user="some_user" 
server="some_server" 
address="$user"@"$server" 

printf -v user_q '%q' "$user" 

function run { 
    ssh "$address" /bin/bash "[email protected]" 
} 

run << SSHCONNECTION1 
    sudo dpkg-query -W -f='${Status}' nano 2>/dev/null | grep -c "ok installed" > /home/$user_q/check.txt 

    softwareInstalled=$(cat /home/$user_q/check.txt) 

SSHCONNECTION1 

を私は何を得る

猫である:ここでは

は私がやっていることは何ですこれは非常に奇妙です。なぜなら、私がSSHを使用して接続し、次のパスをチェックするとファイルが存在するからです。

私は間違っていますか?ファイルは実行可能ではなく、テキストファイルです。 ありがとうございます。

+2

'$(cat ...)'コマンドがローカルで実行されています。 –

+0

btw、以前の質問でリンクした別の答えを書き留めておいてください( 'printf '%q'" $ @ "'を使ってargvリストを生成し、それをコマンドラインでリモートシェルに渡してから、 '$ 1'、' $ 2'などで、これは避けられるシナリオの1つです)。 –

+0

...リモートの '/ bin/sh'が' printf '%q''が生成したものを解析できる必要があるという警告がありますが、これはbashやkshではない場合に問題になるかもしれないし、あなたの議論で –

答えて

1

あなたはcat$(...)$を逃れ、ヒアドキュメントの評価中にローカルでリモートで実行ではなく、したい場合:リモートスクリプトのいくつかの他の部分場合にのみ意味を持ち、もちろん

softwareInstalled=\$(cat /home/$user_q/check.txt) 

"$softwareInstalled"を参照しています(または引用されていないheredocにあるので、"\$softwareInstalled")。

+0

'$ softwareInstalled'が後で使用されます。ありがとう、しかし、なぜ猫はローカルで実行されていますか?私は実行が行ごとに順番に行われていると思いましたか? – Alex

+1

@Alex、 '$(cat ...)'は '$ user_q'にローカル変数があるのと同じ理由でローカルに実行されます:展開はheredocに対応するテキストを生成するときに実行されます。もしそれが起こらないようにしたいのであれば、あなたのsigil( '' SSHCONNECTION1'')を引用することができますが、他の変数は代用されません。 –

+0

ところで、あなたはおそらくこれを解明していますが、heredocのスクリプトの後半部分が '\ $ softwareInstalled'を使っていることを確認してください。そうすれば、ローカルではなくリモートで評価されます。私はこれを指定する答えを編集しました。 –

関連する問題