Scripte aus der Mailanzeige von KMail herauskopieren

Ich habe das Script download.sh1 gemailt bekommen.
Das habe ich per Copy&Paste aus KMail in einen Editor kopiert, in ~/bin abgespeichert und mit chmod +x ausführbar gemacht.

Das Problem

Beim Ausführen erhielt ich folgenden Fehler:

florian@florian:~/bin> ./download_test.sh 
./download_test.sh: line 7: syntax error near unexpected token `do' 
./download_test.sh: line 7: `  for m in $(seq 1 12); do'

Beim Absender geht es, bei mir nicht. Rätselraten. Probieren.

Die Ursache

Das Script enthält zwei oder mehr aufeinander folgende Leerzeichen.
Das ist eigentlich kein Problem.

Als ich mir das Script jedoch mit mcedit2 angesehen habe, wurde für jedes zweite der aufeinander folgenden Leerzeichen statt 0×20 das Zeichen 0xA0 aus der Zeichentabelle verwendet. Die sehen beide gleich aus, es sind auch beides Leerzeichen – aber verschiedene!

Mit dem mcedit sieht das richtig codierte Leerzeichen so aus (rote Umrandung):

Das „falsch“ codierte Leerzeichen sieht im mcedit dagegen so aus (rote Umrandung): 1

ABER: 0×20 wird auch von der Shell als Leerzeichen erkannt und beim Ausführen ignoriert, 0xA0 wird aber versucht mit auszuführen.

In meinem Fall wollte die Shell also nicht

«for m in $(seq 1 12); do»

sondern

« for m in $(seq 1 12); do»

ausführen.
Beachte das Leerzeichen nach dem «! Das ist das 0xA0.
Und da « for» kein Befehl ist, sondern nur «for», kommt für die Shell anstelle von

for .. ; do irgendwas;

ein

 for .. ; do irgendwas; 

heraus.

Die Lösung

Entweder

  • im Script die problematischen Leerzeichen von Hand durch die „richtigen“ Leerzeichen ersetzen (aufwendig!)
  • die email abspeichern und dann mit einem Texteditor alles außer dem Script entfernen
  • mit sed und etwas regex aufräumen

Anmerkung

Dieses Problem besteht auch mit einzelnen Befehlszeilen, wenn der Absender z.B. zwischen Befehl und Option(en) aus Versehen zwei Leerzeichen gemacht hat.
In diesem Fall einfach das überflüssige Leerzeichen entfernen.

Die Shell selber stört sich selber nicht an zwei oder mehreren Leerzeichen:

florian@florian:~/bin> head ../Homepage/bytecamp/grossing.de/index.php 
<?php 
header("Location: home.php"); 
exit(); 
?> 
florian@florian:~/bin> head          ../Homepage/bytecamp/grossing.de/index.php 
<?php 
header("Location: home.php"); 
exit(); 
?>

1 Download zum selber herumspielen

2 mcedit befindet sich im Paket des Midnight Commanders, in openSUSE befindet sich dieser im Paket mc