Warum werden Elemente mit Leerzeichen in einfache Anführungszeichen gesetzt?

187

Mir ist gerade aufgefallen, dass auf einem meiner Computer (auf dem Debian Sid ausgeführt wird), wenn ich lseinen Dateinamen mit Leerzeichen eingebe, einfache Anführungszeichen verwendet werden.

Ich habe meine Aliase sofort überprüft und festgestellt, dass sie intakt sind.

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt
wyatt@debian630:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
wyatt@debian630:~/testdir$

(Bild)

Ein weiterer Test mit Dateien, deren Namen einfache Anführungszeichen enthalten (und die auch eine Anfrage von jimmij beantworten):

wyatt@debian630:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
wyatt@debian630:~/testdir$ touch "'test 1.txt'"
wyatt@debian630:~/testdir$ ls
''\''test 1.txt'\'''  test1.txt
'test 1.txt'          'thishasasinglequotehere'\''.txt'

(Bild)

update mit neuer coreutils-8.26 ausgabe (was zwar weniger verwirrend ist, aber immer noch ärgerlich, wenn man es standardmäßig hat). Dank 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 nie zuvor Dinge in Anführungszeichen gesetzt.

Ich laufe bashund coreutils 8.25.

EDIT: Wie die Entwickler von coreutils dachten (Link) , wäre es eine gute Idee, dies zu einem globalen Standard zu machen, obwohl das Prinzip des geringsten Erstaunens sowie 46+ Jahre UNIX-Tradition gebrochen wurden.

Gibt es eine Möglichkeit, dies ohne Neukompilierung zu beheben?


UPDATE - Oktober 2017 - Debian Sid hat die Shell-Escape-Anführungszeichen standardmäßig wieder aktiviert. Das wird nur lächerlich. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582

Und am Ende der Antwortkette auf den vorherigen Fehlerbericht: "Die Änderung war beabsichtigt und wird bestehen bleiben." https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226

Ich dachte, das wäre erledigt. Scheinbar nicht.

UPDATE: April 2019: Ich habe gerade einen Fehlerbericht in PHP gefunden, der durch diese Änderung von verursacht wurde ls. Wenn Sie Entwickler verwirren und falsche Fehlerberichte generieren, ist es an der Zeit, Ihre Änderungen zu überdenken.

Update: Android Toybox lsmacht jetzt etwas Ähnliches, aber mit Backslashes anstelle von Anführungszeichen. Wenn Sie die Option -q verwenden, werden Leerzeichen als Fragezeichen dargestellt (ich habe nicht überprüft, was sie sind, da sie offensichtlich keine Leerzeichen sind). Das einzige Problem, das ich bisher ohne Rooting des betreffenden Geräts gefunden habe, ist das Hinzufügen dies zu einem Skript und Quell es beim Starten einer Shell. Diese Funktion lsverwendet Spalten, wenn sie sich in einem Terminal befinden, und gibt ansonsten eine Zeile pro Zeile aus, während sie lswörtlich in Druckbereiche übergeht, da diese durch eine Pipe laufen.

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "$@" |cat
    else
        /system/bin/ls "$@" |cat
    fi
}
Wyatt8740
quelle
20
Ein weiterer Grund, warum Sie den lsBefehl nicht analysieren sollten .
Jimmy
12
Es sieht seltsam aus, aber wenn es nur beim Drucken auf einem Terminal aktiviert ist, ist es sinnvoll. Sie sehen deutlich, dass Sie eine Datei 'test 1.txt' und keine Datei 'test' und eine andere '1.txt' haben. Probieren Sie es aus ls | catund sehen Sie, ob es verschwindet. Wenn ich eine Zeitmaschine hätte, würde ich zu Bell Labs ~ 1970 zurückkehren und versuchen, Ken Thompson davon zu überzeugen, dass das Zulassen von Speicherplatz in Datei- und Verzeichnisnamen eine schlechte Idee ist. :-P
Björn Munch
6
Als ich das zum ersten Mal sah, flippte ich aus und dachte, eines meiner Skripte sei schief gelaufen und hätte alle meine Dateien in umbenannt '*'. Ich schätze, ich werde lsalle meine Maschinen mit Aliasen versehen, um sie loszuwerden ...
Begrenzte Versöhnung
14
@LimitedAtonement, wie von Lekensteyn hervorgehoben , können Sie dies mit einer Umgebungsvariablen QUOTING_STYLE=literalanstelle eines Alias tun . (Ich denke, es ist Geschmackssache, aber ich bevorzuge die Variable.)
LSpice
4
@BjornMunch Es gibt zwei Lösungen für die Frage, ob es sich um eine oder zwei Dateien handelt: 1) Sehen Sie nach, wie die Spalten gezeichnet werden, und es ist ziemlich offensichtlich. 2) Listen Sie einen Artikel pro Zeile auf. Beide sehen besser und klarer aus als das Zerfleischen mit einfachen Anführungszeichen.
Wyatt8740

Antworten:

132

Vorwort : Während es sehr befriedigend sein kann , eine Antwort, wie dies upvote und nennt ihn einen Tag, bitte seien Sie versichert , dass GNU - Entwickler nicht über SO beantworten Stimmen egal, und dass , wenn Sie tatsächlich wollen , sie ermutigen , zu ändern , müssen Sie Mailen Sie sie wie in dieser Antwort beschrieben.


" Warum passiert das? "

Einige Coreutils-Entwickler waren der Meinung, sie wüssten mehr als Jahrzehnte von De-facto-Standards.


" Wie stoppe ich es richtig? "

http://www.gnu.org/software/coreutils/coreutils.html :

Fehlerberichte

Wenn Sie glauben, einen Fehler in Coreutils gefunden zu haben, senden Sie bitte einen möglichst vollständigen Fehlerbericht an <[email protected]> . Dieser wird automatisch in den Coreutils-Bug-Tracker eingetragen. Bevor Sie Fehler melden, lesen Sie bitte die FAQ. Eine sehr nützliche und häufig verwendete Anleitung zum Schreiben von Fehlerberichten und zum Stellen guter Fragen ist das Dokument Fragen stellen auf intelligente Weise. Sie können frühere Beiträge durchsuchen und das Bug-Coreutils-Archiv durchsuchen.

Distros, die  diese Änderung bereits rückgängig gemacht haben:

Distros nicht betroffen:

  • openSUSE (bereits verwendet -N)

Msgstr " Irgendeine Möglichkeit, dies ohne Neukompilierung zu beheben? "

Befürworter hätten Sie ...

Kehre zum alten Format zurück, indem du -N zu ihrem ls-Alias ​​hinzufügst

… Auf allen Ihren Installationen, überall, für den Rest der Ewigkeit.

Jan Kyu Peblik
quelle
17
Die Änderung wurde auf der Mailingliste vorgeschlagen und von drei Betreuern von coreutils als Nettonutzen vereinbart. Wir sind offen für konstruktive Argumente. Dies ist schließlich Open Source, wir wollen nicht diktieren, sondern nur Dinge verbessern. Bitte fühlen Sie sich frei im coreutils Thread auf reagieren lists.gnu.org/archive/html/coreutils/2016-02/msg00000.html (BTW die Art und Weise, gab es einen konstruktiven Vorschlag auf einem der ästhetischen Nachteile erwähnt zu verbessern, durch Hinzufügen eines Leerzeichens zur Verbesserung der Ausrichtung)
Pádraig Brady
31
@ PádraigBrady Aktualisierte Antwort. Sie sehen jedoch jede Menge Ablehnung in Ihrem coreutils-Thread. Unter dem Strich schaffen Sie mehr Arbeit für die Menschen und tun dies im Namen eines Betriebssystems, das ein Klon eines Betriebssystems aus dem Jahr 1970 ist. Wenn die Menschen etwas anderes wollen, entscheiden sie sich dafür.
Jan Kyu Peblik
43
@ PádraigBrady Diese Änderung hat mich verärgert und mehrere Stunden damit verschwendet, eine Ursache und eine Lösung zu finden. Ich will nicht negativ sein - ich teile nur den Standpunkt einer anderen Person! Das Ändern des Kernverhaltens hat enorme Auswirkungen.
Afrosis
52
Als jemand, der seit 30 Jahren * nix-Systeme verwendet, finde ich solche Änderungen ziemlich ärgerlich. Zum einen brechen sie langjährige Skripte. Sie verstoßen auch gegen das Prinzip des geringsten Erstaunens. "Opt-in" sollte hier die Standardeinstellung sein, wie oben erwähnt.
Brian Clapper
28
@ PádraigBrady Das ist immer noch nicht der Weg, solche Änderungen voranzutreiben. Es wäre gewesen Weise konstruktivere dieses Verhalten Opt-in haben , anstatt standardmäßig aktiv. Es gibt auch fälschlicherweise Hinweise darauf, wie Dateinamen gespeichert werden, kurz gesagt, lswas Sie sehen, ist nicht mehr, wie es gespeichert wird. Diese Funktion sollte optional sein, nicht die Standardeinstellung.
91

Sie können den Anführungsstil auswählen :

ls --quoting-style=literal

Das Gleiche wie:

ls -N

oder:

QUOTING_STYLE=literal ls

Machen Sie es zu einem Alias ​​oder legen export QUOTING_STYLE=literalSie es fest .bashrc, um ein Verhalten vor 8.25 zu erreichen.

cuonglm
quelle
11
scheint ein bisschen komisch, dass ich das tun muss, um normales Unix-y-Verhalten zu bekommen. Außerdem möchte ich den alten Standard. Ich glaube nicht, dass das Entkommen der alte Standard war - ich denke, es druckte genau das, was tatsächlich da war.
Wyatt8740
9
Verwenden export QUOTING_STYLE=literalSie für Verhalten vor 8.25 in Ihrem bashrc.
Lekensteyn
2
oder verwenden -N, so scheint es. Ich kompiliere gerade meine eigene Version, da ich bereits ein persönliches Repository eingerichtet habe.
Wyatt8740
2
@LSpice Ich habe den Beitrag bearbeitet verwenden literalstatt escape(ich glaube , dass @cuonglm wollte nur zeigen , wie die Art zu ändern, nicht speziell den Targeting - escapeStil).
Lekensteyn
5
Diese Antwort verdient mehr Gegenstimmen. Es geht direkt auf das ein, was der Fragesteller fragte, ohne eine bürokratische Antwort zu geben. Tatsächlich scheint der umweltvariable Ansatz ziemlich elegant zu sein. (Ich persönlich bevorzuge das neue Verhalten, da es eine effizientere C & P-Aktion begünstigt.) Ls ist jedoch clever genug, um sich bei Verwendung einer Umleitung wie bisher zu verhalten, sodass Skripten, die die Ausgabe von ls verwenden, keinen Schaden zufügen.
Marcelo
42

Ein paar Punkte zur Veränderung.

  • Es wurde in Coreutils 8.25 eingeführt und die Ausrichtung in 8.26 verbessert
  • Dies geschieht nur bei der Ausgabe auf Terminals, ohne dass Skripte beschädigt werden
  • Die Ausgabe für Benutzer für Dateien, die Leerzeichen enthalten, wird eindeutig
  • Die Ausgabe wird bereinigt, sodass das Kopieren und Einfügen sicher ist
  • Die Ausgabe ist jetzt immer zum Kopieren und Einfügen in die Shell gültig
  • Benutzer können zum alten Format zurückkehren, indem Sie -N zu ihrem ls-Alias ​​hinzufügen
Pádraig Brady
quelle
7
Mein letztes Beispiel ist nicht mehrdeutig? Vielleicht nicht - aber es ist sicherlich verwirrend und braucht mehr Zeit zum Entschlüsseln. Ich denke, es ist eine schreckliche Veränderung (keine Beleidigung für Sie). Vielen Dank für den Alias-Tipp.
Wyatt8740
27
Hinweis: Diese Änderung wurde in coreutils 8.25 eingeführt ( commit , verfasst von demselben Pádraig wie dieser Beitrag). Persönlich denke ich, dass dieses Verhalten suboptimal ist, es bricht die Ausrichtung, wenn ein Leerzeichen in einem Dateinamen auftritt.
Lekensteyn
10
Ich entschuldige mich - anscheinend zitieren Sie die Shell-Anführungszeichen sicher. Ich mag es immer noch nicht. Die Optionen sind in Ordnung - aber es kann nur eine schlechte Idee sein , das sehr gut spezifizierte Standardverhalten eines jahrzehntealten Unix-Kerndienstprogramms so zu ändern, dass seine Richtigkeit abnimmt .
mikeserv
12
@ PádraigBrady Also, wirst du lskaputt bleiben ? Sehen Sie sich all diese Argumente gegen Ihre Änderung an. Niemand will es. Vielleicht ist es an der Zeit, sich bei der Welt zu entschuldigen und es rückgängig zu machen.
Chris Warrick
6
@ PádraigBrady Also trotz der vielen Leute, die erklärt haben, wie das falsch, kaputt usw. ist, wirst du das immer noch nicht rückgängig machen, so dass der Standard unverändert bleibt? Entgegen Ihrer Überzeugung ist diese Änderung nicht eindeutig. Die Annahme, dass Benutzer eine Umgebungsvariable oder einen Alias ​​festlegen, ist bestenfalls idiotisch.
Mark