Warum löscht rm im Bash-Skript eine Datei mit Leerzeichen trotz Anführungszeichen nicht?
Antwort vomDie Anführungszeichen werden nicht ignoriert: Dein Code übergibt den Dateinamen korrekt als ein einziges Argument an rm.
Bash wertet die Anführungszeichen aus und entfernt sie anschließend. Sie verhindern dabei, dass das Leerzeichen den Dateinamen in zwei Argumente zerlegt. rm erhält also den Namen Meine Datei.txt ohne zusätzliche Anführungszeichen. Das ist beabsichtigt.
Was die Löschung verhindern kann
Die gezeigten Zeilen sind korrekt. Ohne die konkrete Fehlermeldung lässt sich die Ursache nicht eindeutig feststellen. Prüfe zunächst, ob die Datei im aktuellen Arbeitsverzeichnis liegt, ob der Name exakt stimmt und ob rm einen Fehler meldet. Die Bash-Dokumentation beschreibt dafür unter anderem pwd, printf und die Ablaufverfolgung mit set -x.
Diese Diagnose löscht nichts:
dateiname="Meine Datei.txt"
pwd
printf 'Dateiname: <%q>\n' "$dateiname"
ls -lb -- "$dateiname"
Ein wichtiger Unterschied: Das aktuelle Arbeitsverzeichnis ist nicht automatisch das Verzeichnis, in dem das Skript gespeichert ist. Bei einem Start aus einem anderen Verzeichnis kann deshalb ein absoluter Dateipfad erforderlich sein.
Warum die Ausgabe täuschen kann
Eine Ablaufverfolgung mit set -x stellt Befehle nach der Expansion dar, nicht zwingend mit den ursprünglich geschriebenen Anführungszeichen. Deren Darstellung beweist deshalb nicht, dass die Argumente falsch getrennt wurden.
Das doppelte Minus in deinem Befehl ist ebenfalls richtig: Es beendet die Optionsverarbeitung und schützt beispielsweise Dateinamen, die mit einem Minus beginnen. Es behebt aber keine falschen Pfade oder fehlenden Berechtigungen.
Quellen:
Erstellt mit GPT-6.1 Sol (OpenAI) auf Basis einer aktuellen Websuche.