Se você tivesse escrito isso:
rsync " -a $params $source/* $destination"
então o comando rsync
estaria obtendo uma única string como seu argumento, porque todas as variáveis são expandidas entre aspas duplas. Por exemplo, se $params
for --exclude=.git
, $source
for /somewhere
e $destination
for /elsewhere
, o argumento será
-a --exclude=.git /somewhere/* /elsewhere
Há um enrugamento adicional: "${params[@]}"
divide o array em parâmetros separados. O texto antes de ${params[@]}
é anexado ao primeiro elemento da matriz e o texto após ${params[@]}
é anexado ao último elemento da matriz. Então, rsync
é chamado com quatro parâmetros:
-a --exclude=.git
--exclude=deploy
--exclude=app/config/database.php
--exclude=app/config/config.php /somewhere/* /elsewhere
Cada parâmetro deve ser uma string separada entre aspas duplas. Você precisa das aspas duplas para proteger a expansão das variáveis, caso elas contenham espaços em branco ou caracteres curinga. Para a matriz expandida com ${NAME[@]}
, "${NAME[@]}"
coloca cada elemento em um parâmetro separado. Os espaços que separam os elementos e os caracteres que devem funcionar como curingas devem permanecer sem aspas.
rsync -a "${params[@]}" -- "$source"/* "$destination"
Isso exclui os arquivos de ponto diretamente sob $source
, por causa do /
. Para copiar arquivos em $source
para arquivos com o mesmo nome em $destination
, basta colocar uma barra após o caminho para o diretório de origem.
rsync -a "${params[@]}" -- "$source/" "$destination"