Самый простой способ убедиться, что все цитирование выполнено правильно, — это заставить оболочку сделать это за вас, используя declare -f
для генерации текстового представления уже -локально -определенной функции, и declare -p
для создания текстовых представлений любых локальных переменных, к которым функция нуждается в доступе. Таким образом:
doRemoteWork() {
jq -Rn --argjson original_doc "$(<nodes.json)" '
input | split("\u0000") as $ips
| $original_doc
|.nodes.app.ip = $ips[0]
|.nodes.data.ip = $ips[1]
|.nodes.analysis.ip = $ips[2]
|.nodes.elastic_kafka_1.ip = $ips[3]
|.nodes.elastic_kafka_2.ip = $ips[4]
|.nodes.elastic_kafka_3.ip = $ips[5]
|.nodes.master.ip = $ips[6]
' < <(printf '%s\0' "${GCP_INSTANCES[@]}") >"nodes.json.$$" \
&& mv "nodes.json.$$" nodes.json
}
ssh -o StrictHostKeyChecking=no -i key.pem user@172.13.1.23 \
"$(declare -p GCP_INSTANCES; declare -f doRemoteWork); doRemoteWork"