[Linux] rsync funktioniert auf Komandozeile aber nicht bash Script

OP #7422577
Lesenswert?

Ich habe hier ein doofes Problem:

ich archiviere meine Systemdaten mit Rsync um das System im Fehlerfall wieder herzustellen. Dies funktioniert auch tadellos. Aktuelle fahre ich dieses Backup immer so:

1
rsync -a --progress / --exclude={"/boot/*","/swap.img","/BU/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/storage/*","/storage4TB/*","/lost+found"} /storage4TB/back

manuell direkt über die Komandozeile.

Wenn ich dies jedoch in ein Bashcript einfüge, dann nimmt er die excludezeile nicht mit. und kopiert alles, was ja durch die swap file und die proc/kcore natürlich überhaupt nicht geht, auch würde er Dateien kopieren (z.b. boot) welche nach einem neu aufgesetzten Rechner nicht zurück darf.

Wie kann ich dies in ein Bash Script einfügen damit er auch die excludes übernimmt?! (Dies ist natürlich nur ein Einzeiler, wird hier im Forum aber hinter exclude gekippt)

Script ganz simpel:

1
#!/bin/sh
2

3
rsync -a --progress / --exclude={"/boot/*","/swap.img","/BU/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/storage/*","/storage4TB/*","/lost+found"} /storage4TB/back

BS: Debian 11 (Bullseye) - Kernel 5.15.107-2 Rsync: 3.2.3 protocol version 31

Moderator Persönliche Seite #7424057
Lesenswert?

Der Unterschied wird klar, wenn man den Einzeiler einmal mit "echo" davor in der Kommandozeile jeweils in der bash und in der dash ausgeben lässt - hier gekürzt zwecks besserer Übersichtlichkeit:

1
$ echo rsync -a --progress / --exclude={"/boot/*","/swap.img"} /storage4TB/back                                                                                                                 rsync -a --progress / --exclude=/boot/* --exclude=/swap.img /storage4TB/back
2
$ dash
3
$ echo rsync -a --progress / --exclude={"/boot/*","/swap.img"} /storage4TB/back
4
rsync -a --progress / --exclude={/boot/*,/swap.img} /storage4TB/back

Die bash bröselt den Ausdruck {...} in mehrere Ausdrücke auf und übergibt jedes Teil davon extra mittels "--exclude=XXX" an rsync. Die dash kann das nicht.

(Man könnte das Script auch portabel schreiben, aber egal.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren