SSHによる配列割り当ての文字列補間

SSHによる配列割り当ての文字列補間

配列にコンテナ名を割り当てようとしています。

配列に割り当てずに実行すると、コマンドは完全に実行されます。

ARR=docker network inspect --format '{{ range $key, $value := .Containers }}{{ printf "%s\n" $value.Name}}{{ end }}' some_network $$ echo $ARR

私は同じことをしたいのですが、SSHを介して:

ssh [email protected] "
ARR=( $(docker network inspect --format '"'{{ range $key, $value := .Containers }}{{ printf "%s\n" $value.Name}}{{ end }}'"' some_network) ) && echo $ARR
"

しかしそれは文句を言う:

Template parsing error: template: :1: unexpected unclosed action in command

その理由は、文字列の補間やエスケープによるもののようです'。誰にでもアドバイスできますか?

ベストアンサー1

二重引用符内では、コマンド置換はローカル側で処理され、ローカルシェルは内部の引用符を確認します。

リモートで実行するには、次のものが必要です。

ssh [email protected] '
  ARR=( $(docker network inspect --format '\''{{ range $key, $value := .Containers }}{{ printf "%s\n" $value.Name}}{{ end }}'\'' some_network) ) && echo $ARR
'

あるいは、stdinを介してコマンドを実行して参照地獄を避けることもできます。

ssh [email protected] <<'EOF'

ARR=( $(docker network inspect --format '{{ range $key, $value := .Containers }}{{ printf "%s\n" $value.Name}}{{ end }}' some_network) ) && echo $ARR
EOF

または、スクリプト全体を別のファイル(リモートまたはローカル側)に配置し、そのファイルで実行します。

おすすめ記事