staging.inyokaproject.org

Quoting mit rsync in Bash-Script

Status: Ungelöst | Ubuntu-Version: Xubuntu 14.04 (Trusty Tahr)
Antworten |

glaskugel

Anmeldungsdatum:
8. Juli 2010

Beiträge: 3849

Ich habe ein Script, das meistens funktioniert, aber manchmal nicht und das versuche ich herauszufinden. Vermutlich hängt es mit den Rsync-Optionen zusammen. http://tldp.org/LDP/abs/html/quotingvar.html hat mich nicht weitergebracht.

Je nach Bedingung sind die Rsync-Optionen unterschiedlich, also möchte ich die in eine Variable geben.

rsyncopt=( -e "ssh -p $PORT" -rcvL --modify-window=2 --stats --delete )
echo "rsyncopt (1) ""$rsyncopt"

Warum ergibt das (zur Kontrolle nur

rsyncopt (1) -e

und nicht mehr? Das Script tut dann aber meistens das was es soll, aber 1x nicht und ich habe noch nicht kapiert warum. Eventuell ist es ein Versionen-Problem. Ich möchte also den Befehl ohne Variablen darstellen, den das Script ausführt und den dann in einer Shell genauso ausführen.

echo "/usr/bin/rsync ""${rsyncopt[@]}"" $syncquelle $syncziel"

So führt es das Script aus:

time /usr/bin/rsync "${rsyncopt[@]}" "$syncquelle" "$syncziel"

Wie muss ich also bitte korrekt quoten?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

glaskugel schrieb:

rsyncopt=( -e "ssh -p $PORT" -rcvL --modify-window=2 --stats --delete )
echo "rsyncopt (1) ""$rsyncopt"

Warum ergibt das (zur Kontrolle nur

rsyncopt (1) -e

und nicht mehr?

Weil Du die falsche Expansion für eine Array-Variable nutzt. Nimm:

1
echo "rsyncopt (1) ${rsyncopt[*]}"

Für die Ausführung ist die Variante mit "[@]" korrekt, die Du weiter unten aufführst.

Das Script tut dann aber meistens das was es soll, aber 1x nicht und ich habe noch nicht kapiert warum. Eventuell ist es ein Versionen-Problem. Ich möchte also den Befehl ohne Variablen darstellen, den das Script ausführt und den dann in einer Shell genauso ausführen.

echo "/usr/bin/rsync ""${rsyncopt[@]}"" $syncquelle $syncziel"

Da sind zu viele doppelte doppelte Anführungszeichen. Die sind völlig überflüssig hier.

So führt es das Script aus:

time /usr/bin/rsync "${rsyncopt[@]}" "$syncquelle" "$syncziel"

So ist es für die Ausführung richtig!

Antworten |