Forum: PC Hard- und Software [Linux] rsync funktioniert auf Komandozeile aber nicht bash Script


von Rene K. (xdraconix)


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

von Piotr B. (birnen)


Lesenswert?

Im Skript wird höchstwahrscheinlich ein anderer Shell benutzt als vom 
Kommandozeile. Kommandozeile wird meist bash genutzt.

Ich würde im Skript als Shebang '#!/bin/bash' schreiben, dann müsste es 
gehen.

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?


von Rolf M. (rmagnus)


Lesenswert?

Piotr B. schrieb:
> Im Skript wird höchstwahrscheinlich ein anderer Shell benutzt als vom
> Kommandozeile. Kommandozeile wird meist bash genutzt.

Ja, bei debian ist /bin/sh ein Link auf die dash.

von Rene K. (xdraconix)


Lesenswert?

Super, wunderbar - mit bin/bash funktioniert es tadellos.

Dankeschön. ☺️

von Frank M. (ukw) (Moderator) Benutzerseite


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.)

: Bearbeitet durch Moderator
von Norbert (der_norbert)


Lesenswert?

Frank M. schrieb:
> (Man könnte das Script auch portabel schreiben, aber egal.)

Ja das kann man machen, wenn man es denn tatsächlich portabel braucht.
Falls nicht (wie wohl in recht vielen Fällen) ist es nicht strengstens 
verboten, die mächtigeren Fähigkeiten der bash auch bequem zu nutzen.

Dann sollte man jedoch zumindest ein passendes ›shebang‹ setzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.