Soweit ich das weiß, ist das in dieser Form ohne eval
unmöglich.
Du belegst deine CMD-Variable mit einem Wert. Aber dieser Wert ist ein einfacher String, also geht die Information verloren, welche Zeichen ursprünglich mal ein einzelnes Argument waren. Das versuchst du nun mit Quotes zu beheben. (Schau dir deinen Text übrigens mal in einem Editor mit Syntax-Highlighting an – so wie da kann es schonmal gar nicht gehen, weil die doppelten Anführungszeichen um $SOURCE
den geschützten Bereich eigentlich beenden. 😉 )
Also hättest du jetzt die Möglichkeit, durch eval
Quotes im String auswerten zu lassen:
| FOO="ls bar 'und so weiter' 'mit viel abstand'"
eval "$FOO"
|
Kommt raus:
ls: cannot access bar: No such file or directory
ls: cannot access und so weiter: No such file or directory
ls: cannot access mit viel abstand: No such file or directory
Er hat also "bar" und "und so weiter" als je ein Argument aufgefasst, der große Abstand ist auch noch da. eval
ist aber hässlich. Ich persönlich hab mir angewöhnt, das so weit wie möglich zu vermeiden, um nicht in wundersame Fallen zu rennen...
Die andere Alternative wäre ein Array. Das ist halt mehr als nur ein String, hier gibt's einzelne Elemente – und die können auch Leerzeichen enthalten, ohne dass es knallt:
| FOO=("ls" "bar" "und so weiter" "mit viel abstand")
"${FOO[@]}"
|
Und bei deinem Beispiel sähe das so aus:
| SOURCE="/media/Secure/Dokumente und Einstellungen/_diverses/"
DESTINATION="/media/backup/Backups/Bank/last_2010_05_19_15:54:26/"
CMD=("rsync" "-a" "-v" "--delete" "$SOURCE" "$DESTINATION")
echo "${CMD[@]}"
"${CMD[@]}"
|
Ob's dir das alles wert ist, musst du entscheiden – oder mit mir zusammen auf eine Antwort hoffen, die einen viel einfacheren Weg aufzeigt. ☺
Wenn es nicht so sehr auf die Details ankommt, kannst du auch set -x
benutzen:
| set -x
ls "$SOURCE" "wieder viel abstand"
set +x
|
Das zeigt dir auch die Befehle vor der Ausführung an. Du siehst dann halt noch das set +x
, um diese Ausgabe wieder abzuschalten.