Resposta curta: veja BashFAQ # 050 .
Resposta longa: o problema que você está tendo é que a inserção de cotações em variáveis não funciona da maneira que você acredita. Especificamente, as cotações são analisadas antes que as variáveis sejam substituídas. Assim, se o valor de uma variável incluir cotações, é muito tarde para que elas funcionem corretamente. Quando você define RSYNCOPT="--rsh=\"ssh -p 10022 -c des\" ..."
e, em seguida, usa ${RSYNCOPT}
em uma linha de comando, as aspas da variável não são analisadas, elas são tratadas apenas como caracteres normais. Portanto, em vez de o comando rsync receber um único parâmetro --rsh=ssh -p 10022 -c des
, ele recebe 5: --rsh="ssh
, -p
, 10022
, -c
e des"
. Como o comando --rsh contém uma única citação (sem correspondência), você recebe um erro.
Para ver o que está acontecendo melhor, use set -x
para fazer o shell imprimir cada comando antes de executá-lo (para que você possa ver o que realmente está acontecendo) ou substitua o echo ${whatever}
(que é altamente enganoso) por printf "%q " ${whatever}; echo
.
Existem várias maneiras de resolver isso. Uma é evitar a tentativa de armazenar RSYNCOPT
(e provavelmente outras coisas também) em variáveis em primeiro lugar. Outra é armazenar RSYNCOPT
como uma matriz (que pode controlar os limites das palavras sem qualquer confusão) em vez de uma cadeia simples.
Para imprimir o comando antes de executá-lo, use set -x
antes do comando rsync e configure + x after para desativá-lo ou use algo como o comando printf
listado acima (observe que ele imprime um espaço perdido após o comando, mas isso geralmente não importa).
Veja a abordagem do array + printf:
...
RSYNCOPT=(--rsh="ssh -p 10022 -c des" --rsync-path=\"/opt/bin/rsync\" --inplace --progress -a -vv)
...
printf "%q " ${SCREEN} ${SCREENOPT} ${SCREEN_TITLE}
echo
printf "%q " ${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}
echo
${RSYNC} "${RSYNCOPT[@]}" ${SOURCE} ${REMOTE_USER}${REMOTE_HOST}${REMOTE_BASE}${REMOTE_TARGET}