Der Chor der Shelltanten tritt auf.
Chor: Niemals, niemals, niemals
Gurubariton: Außer wir wissen, wissen, wissen
Chor: niemals, niemals, niemals
Gurubariton: sehr genau was wir tun
Chor: niemals, niemals, niemals
Sopran: Early in the morning!
Chor: Parsen wir, den output von ls
Sopran: Late in the evening!
Chor: Niemals, niemals, nicht!
Gurubariton: Und wenn Du doch find hast!
Gurubariton: Find hat alles was Du brauchst!
| find . -name "*.txt" -exec echo ln -s {} /home/dirk/Links/ISO ";" -print
|
Leerstellen (und schlimmeres) in Dateinamen und Pfaden müssen in der Shell (aber nicht in Gnu-find) maskiert werden. Daher, wenn möglich, wie hier in find abhandeln und nicht rauskleckern und dann in die Shell wieder reinpfriemeln.
Dass Du das, was Du aus einer Datei liest, interpretierst kann niemand wissen.
erwartet eine Quelle A und ein Ziel B.
Soll das als ln -s "a b" c oder als ln -s a "b c" interpretiert werden? Woher soll ln wissen, $line nicht 2 Parameter, 3 Parameter oder was sind? Woher soll read wissen, dass es sich um Dateipfade handelt, die Du maskiert brauchst?
Wenn Deine Datei einen Backslash enthält fällt auch die Maskierung auf die Nase:
Gurubariton: Man kann sowas machen, wenn die Dateinamen von einem selbst angelegt werden, und man Blanks u.ä. konsequent vermieden hat, oder von einem Programm, das man kennt (Kamerabilder die immer CIMG-NNNNN.JPG heißen mit NNNNN als fortlaufende Nummer). Heikel ist es, wenn die Dateien aus unbekannter Quelle stamme, womöglich automatisch aus Textüberschriften generiert sind und alles mögliche enthalten, noch heikler, wenn sie ein Dritter, der um Dein Programm weiß, gezielt anlegen kann und als Einfallstor für Malware oder Sabotage nutzen kann. Am schlimmsten, wenn Du es als Routine an Dritte weitergibst, die die Fallstricke nicht kennen und das Programm für diese heiklen Zwecke einsetzen.
Jedenfalls ist es ein Phänomen des Shellparsing, welches immer wieder auftreten kann. Üblicherweise wird Whitespace vom Tokenizer als Trenner für einzelne Token interpretiert. Das kann man nicht bei jedem Befehl dazuschreiben.