Bash scripting rsync puzzler

1

Frustrante. O script abaixo funciona para os dois primeiros alvos, mas não para o segundo.

#!bin/bash
...
backitup () {
Todaysdate='date "+%Y-%m-%dT%H_%M_%S"'
Sourcedir=$1
Destination=$2
Username=$(echo $Sourcedir | cut -f1 -d'@')
if [ "$Username" = "root" ] ; then
    RSYNCPATH="rsync"
else
    RSYNCPATH="sudo rsync"
fi

cmd="sudo rsync -vazP --rsync-path='$RSYNCPATH' --log-file=/var/log/rsync.log $Sourcedir /BACKUPS/$Destination/back-$Todaysdate"
                echo $cmd >> ~/cmd.txt
                $cmd
...
}
backitup root@HAZns01:/etc "HAZNS01/etc"
backitup root@HAZns01:/home/ftpusers "HAZNS01/ftpusers"
backitup jakadmin@HAZFAND10:/etc "HAZFAND10/etc"
backitup jakadmin@HAZFAND11:/etc "HAZFAND11/etc"

As duas segundas chamadas dão:

unexpected remote arg: jakadmin@HAZFAND10:/etc

Se, no entanto, eu executar, em seguida, executar o conteúdo do cmd.txt manualmente a partir da linha de comando (bash cmd.txt), em seguida, ele é executado corretamente. Como pode ser? (Eu tenho o ssh sem senha, tudo configurado corretamente, claro)

O que estou perdendo?

    
por snori74 27.05.2013 / 22:47

1 resposta

4

Por favor, veja BashFAQ / 050 .

This fails because of WordSplitting and because the single quotes inside the variable are literal; not syntactical.

Você deve evitar colocar comandos em variáveis ao criar scripts de shell.

Use uma função para poder reutilizar um comando. Use set -x para registro. Ou use uma matriz para conter as partes individuais do comando e seus argumentos somente se for necessário.

A propósito, em uma linha você usa $() para substituição de comando. Este é o caminho correto. Em outra linha você usa backticks que estão obsoletos. Pelo menos seja consistente.

    
por 28.05.2013 / 02:58

Tags