O conjunto de opções pode ser visualizado usando printf
:
$ printf '<%s> ' "-e ssh -axhPv" arg2 arg3 ; echo
<-e ssh -axhPv> <arg2> <arg3>
Se as aspas forem removidas, isso é o que você recebe:
$ printf '<%s> ' -e ssh -axhPv arg2 arg3 ; echo
<-e> <ssh> <-axhPv> <arg2> <arg3>
Ou seja: os argumentos são divididos em espaços e dados como elementos separados no comando.
Matriz
No entanto, a solução geral não é remover aspas. Isso expõe cada argumento à divisão do IFS e à expansão do nome de caminho.
A solução correta é usar matrizes de valores:
$ a=(-e ssh -axhPv arg2 arg3)
$ printf '<%s> ' "${a[@]}"; echo
<-e> <ssh> <-axhPv> <arg2> <arg3>
Isso permite adicionar opções e até mesmo opções com espaços:
$ a+=("arg with spaces" "one more")
$ printf '<%s> ' "${a[@]}"; echo
<-e> <ssh> <-axhPv> <arg2> <arg3> <arg with spaces> <one more>
Então você mantém o controle sobre como os argumentos serão dados ao comando.
Seu script foi reescrito:
#!/bin/bash
# Set rsync command options.
rsync_options=( "-e" "ssh" "-axhPv" )
if [ "$deletion_type" = "DELETE_ON_DESTINATION" ]; then
rsync_options+=( "--delete" )
fi
if [ "$run_type" = "DRY_RUN" ]; then
rsync_options+=("--dry-run")
fi
log_file="/var/tmp/log/script.sh"
exclude_file="/var/tmp/log/excludethis"
source_dir=/a
destination_dir=/b
# Run the backup.
rsync_options+=('--log-file="'"$log_file"'"')
rsync_options+=('--exclude-from="'"$exclude_file"'"')
rsync_options+=("$source_dir")
rsync_options+=("$destination_dir")
### Remove the printf to actually run the command:
printf '<%s> ' rsync "${rsync_options[@]}"
CAVEAT: Uma coisa que você não pode colocar dentro da matriz é redirecionar.