Ich habe das gerade auf einem meiner Rechner (auf dem Debian Sid läuft) bemerkt, wenn ich ls
eingebe Jeder Dateiname mit Leerzeichen wird in einfache Anführungszeichen gesetzt.
Ich habe sofort meine Aliase überprüft, nur um sie intakt zu finden.
[email protected]:~/testdir$ ls
'test 1.txt' test1.txt
[email protected]:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
[email protected]:~/testdir$
(Bild)
Ein weiterer Test mit Dateien, die einfache Anführungszeichen in ihren Namen enthalten (auch als Antwort auf eine Anfrage von jimmij):
[email protected]:~/testdir$ ls
'test 1.txt' test1.txt 'thishasasinglequotehere'''.txt'
[email protected]:~/testdir$ touch "'test 1.txt'"
[email protected]:~/testdir$ ls
''''test 1.txt'''' test1.txt
'test 1.txt' 'thishasasinglequotehere'''.txt'
(Bild)
Update mit neuer Ausgabe von coreutils-8.26 (was zugegebenermaßen viel weniger verwirrend, aber immer noch irritierend ist, standardmäßig zu haben). Danke an Pádraig Brady für diesen Ausdruck:
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
Warum passiert dies? Wie stoppe ich es richtig?
zur verdeutlichung habe ich selbst ls auf automatische farbausgabe eingestellt. Es hat noch nie Dinge in Anführungszeichen gesetzt.
Ich verwende bash
und coreutils 8.25.
BEARBEITEN:
Anscheinend dachten die Coreutils-Entwickler (Link), es wäre eine gute Idee, dies zu einem globalen Standard zu machen, obwohl sie gegen das Prinzip des geringsten Erstaunens sowie über 46 Jahre UNIX-Tradition verstoßen.
Gibt es eine Möglichkeit, dies ohne Neukompilierung zu beheben?
UPDATE – Oktober 2017 – Debian Sid hat das Shell-Escape-Quoting standardmäßig wieder aktiviert. Das wird gerade lächerlich. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
Und am Ende der Antwortkette auf den vorherigen Fehlerbericht steht:„Die Änderung war beabsichtigt und wird bleiben.“ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
Ich dachte, das sei geklärt. Anscheinend nicht.
UPDATE:April 2019:Ich habe gerade einen falschen Fehlerbericht in PHP gefunden, der durch diese Änderung an ls
verursacht wurde . Wenn Sie Entwickler verwirren und falsche Fehlerberichte generieren, ist es an der Zeit, Ihre Änderungen zu überdenken.
Update:Android-Spielzeugkiste ls
macht jetzt etwas Ähnliches, aber mit Backslashes anstelle von Anführungszeichen. Mit der Option -q werden Leerzeichen als „Fragezeichen“ dargestellt (ich habe nicht überprüft, was sie sind, da es sich offensichtlich nicht um Leerzeichen handelt). Die einzige Lösung, die ich bisher gefunden habe, ohne das betreffende Gerät zu rooten, ist das Hinzufügen dies in ein Skript und beziehen Sie es beim Starten einer Shell. Diese Funktion macht ls
Verwenden Sie Spalten, wenn Sie sich in einem Terminal befinden, und geben Sie andernfalls eine pro Zeile aus, während Sie ls
austricksen wörtlich in Leerzeichen gedruckt, weil es durch eine Röhre läuft.
ls() {
# only way I can stop ls from escaping with backslashes
if [ -t 1 ]; then
/system/bin/ls -C [email protected] |cat
else
/system/bin/ls [email protected] |cat
fi
}
Akzeptierte Antwort:
Vorwort :Auch wenn es ziemlich befriedigend sein kann, eine Antwort wie diese hochzustimmen und Schluss damit zu machen, seien Sie bitte versichert, dass sich die GNU-Coreutils-Betreuer nicht um SO-Antwortstimmen kümmern, und das wenn Sie wirklich wollen um sie zur Änderung zu ermutigen , müssen Sie ihnen eine E-Mail senden wie diese Antwort beschreibt.
Aktualisierung 2019 :
Irgendwann im vergangenen Jahr haben sich die Betreuer verdoppelt und bieten jetzt allen [E-Mail-geschützten] Berichten zu diesem Problem nur eine Standardantwort an, die auf eine unglaublich lange Seite auf ihrer Website verweist, die Probleme auflistet, die Menschen mit dieser Änderung haben zu deren Ignorierung sie sich verpflichtet haben.
Der unaufhörliche Druck von [E-Mail-geschützten] Berichten hat sich eindeutig ausgewirkt, die Erstellung dieser riesigen und absurden Seite erzwungen und möglicherweise die Anzahl der Betreuer, die bereit sind, sich mit dem Problem zu befassen, auf nur einen reduziert.
Wenn so viele Leute etwas für einen Fehler halten, dann ist es ein Fehler, ob die Betreuer anderer Meinung sind oder nicht.
Versenden Sie weiterhin E-Mails bleibt der einfachste Weg, Veränderungen zu fördern.
„Warum passiert das? „
Verwandte:Kontinuierliches Lesen aus Named Pipe (cat oder tail -f)?Mehrere Coreutils-Betreuer entschieden, dass sie es besser wussten als jahrzehntelange De-facto-Standards.
„Wie stoppe ich es richtig? „
http://www.gnu.org/software/coreutils/coreutils.html:
Fehlerberichte
Wenn Sie der Meinung sind, dass Sie einen Fehler in Coreutils gefunden haben, senden Sie bitte einen so
vollständigen Fehlerbericht wie möglich an <[email protected]> , und es
wird automatisch in den Coreutils-Bugtracker eingetragen. Bevor
Fehler gemeldet werden, lesen Sie bitte die FAQ. Eine sehr nützliche und oft zitierte
Anleitung zum Schreiben von Fehlerberichten und zum Stellen guter Fragen ist das
Dokument How To Ask Questions The Smart Way . Sie können frühere
Beiträge durchsuchen und das bug-coreutils-Archiv durchsuchen.
Distributionen, die bereits zurückgesetzt wurden diese Änderung:
Debian coreutils-8.25-2Einschließlich folglich vermutlich Ubuntu und all der Hunderte von Debian-basierten und Ubuntu-basierten Derivaten
Nicht betroffene Distributionen:
- openSUSE (bereits verwendet -N)
„Irgendeine Möglichkeit, dies ohne Neukompilierung zu beheben? „
Befürworter würden Sie haben ...
kehren Sie zum alten Format zurück, indem Sie -N zu ihrem ls-Alias hinzufügen
…bei all Ihren Installationen, überall, für den Rest der Ewigkeit.