ubuntuusers.de

Whitespace in Pfadnamen wie quoten

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

blueshack

Anmeldungsdatum:
20. September 2007

Beiträge: Zähle...

Hi zusammen !

Ich beiß mir die Zähne aus. Meine Shell, die Isebill, tut nicht so wie ich es will. 😢

in der BASH möchte ich rsync ausführen und mir forher den fertigen Befehl anzeigen

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}

Das Source-Verzeichnisse existiert und kommt von einer gemounteten NTFS Platte 😉 Destination wird angelegt auf einer EXT4 Platte

leider geht der Befehl nicht, wenn ich jedoch die, am Bildschirm angezeigte, Befehlszeile kopiere und ausführe, gehts.

Was kann ich machen ?

Danke

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

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:

1
2
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:

1
2
FOO=("ls" "bar" "und so weiter" "mit viel        abstand")
"${FOO[@]}"

Und bei deinem Beispiel sähe das so aus:

1
2
3
4
5
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:

1
2
3
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.

blueshack

(Themenstarter)

Anmeldungsdatum:
20. September 2007

Beiträge: 6

Hallo Vain !

Danke für die Antwort. Einiges ist für mich zwar noch 'Spanisch', aber ich werde deine Aussagen weiter verfolgen. Was aber für mich 'gold wert' war ist, set -x

Ich hab lange nach einen MSDOS 'echo on' gesucht und im Netz nichts gefunden.

Das ist die Lösung, nun kann ich weiter testen und seh, was die Zeile wirklich macht.

Ich hab nämlich recht eigenartiges Verhalten bei rsync festgestellt, das mit den Whitspaces zusammenhängt.

Danke einstweilen

Antworten |