it-swarm.com.de

Warum schließt 'ls' Elemente plötzlich mit Leerzeichen in einfache Anführungszeichen ein?

Ich habe gerade bemerkt, dass auf einem meiner Computer (auf dem Debian Sid ausgeführt wird) bei jeder Eingabe von ls jeder Dateiname mit Leerzeichen in einfache Anführungszeichen gesetzt wird.

Ich überprüfte sofort meine Aliase, 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, deren Namen einfache Anführungszeichen enthalten (auch auf 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 zwar viel weniger verwirrend ist, aber standardmäßig immer noch irritierend ist). Vielen 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 noch nie Zitate um Dinge geschrieben.

Ich verwende bash und coreutils 8.25.

BEARBEITEN: Es scheint, dass die Entwickler von coreutils dachten (Link) es wäre eine gute Idee, dies trotz Bruch zu einem globalen Standard zu machen das Prinzip des geringsten Erstaunens sowie über 46 Jahre UNIX-Tradition.

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


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

Und am Ende der Antwortkette zum 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: Es wurde gerade ein falscher Fehlerbericht in PHP gefunden, der durch diese Änderung an ls verursacht wurde. Wenn Sie Entwickler verwirren und falsche Fehlerberichte erstellen, ist es Zeit, Ihre Änderungen zu überdenken.

Update: Android toybox ls macht jetzt etwas Ähnliches, jedoch mit Backslashes anstelle von Anführungszeichen. Mit der Option -q werden Leerzeichen als 'Fragezeichen' gerendert (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, besteht darin, dies einem Skript hinzuzufügen und es beim Starten einer Shell als Quelle zu verwenden. Diese Funktion macht ls Verwenden Sie Spalten, wenn Sie sich in einem Terminal befinden, und drucken Sie andernfalls eine Zeile, während Sie ls wörtlich in Druckbereiche einfügen, 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 [email protected] |cat
    else
        /system/bin/ls [email protected] |cat
    fi
}
208
Wyatt8740

Vorwort : Obwohl es durchaus befriedigend sein kann, eine Antwort wie diese zu bewerten und sie als Tag zu bezeichnen, können Sie sicher sein, dass die GNU Coreutils-Betreuer kümmern sich nicht um SO Antwortstimmen und das , wenn Sie tatsächlich möchten, dass sie dazu ermutigt ändere , du musst sie per E-Mail senden , wie in dieser Antwort beschrieben.


Update 2019 :
Irgendwann im vergangenen Jahr haben sich die Betreuer verdoppelt und bieten jetzt allen [email protected] zu diesem Problem nur eine Antwort auf eine unglaublich lange Seite auf) an ihre Website listet Probleme auf, die Menschen mit dieser Änderung haben, die sie zu ignorieren verpflichtet haben .
Der unaufhörliche Druck von [email protected] hat sich eindeutig ausgewirkt und die Erstellung dieser immensen und absurden Seite erzwungen und möglicherweise die Anzahl der Betreuer verringert, die bereit sind, sich mit dem Problem zu befassen zu nur einem.
Wenn so viele Leute eine Sache als Fehler betrachten, dann ist es ein Fehler, ob die Betreuer anderer Meinung sind oder nicht.
Wenn Sie weiterhin per E-Mail senden , bleibt dies der einfachste Weg, um Änderungen zu fördern.


" Warum passiert das ?"

Mehrere Coreutils-Betreuer entschieden, dass sie mehr als Jahrzehnte von De-facto-Standards kannten.


" 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]>, und es wird automatisch in den Coreutils Bug Tracker eingegeben. Bevor Sie Fehler melden, lesen Sie bitte die FAQ. Eine sehr nützliche und häufig zitierte Anleitung zum Schreiben von Fehlerberichten und zum Stellen guter Fragen ist das Dokument So stellen Sie Fragen auf intelligente Weise. Sie können frühere Beiträge durchsuchen und das Bug-Coreutils-Archiv durchsuchen.

Distros, die bereits zurückgesetzt diese Änderung:

Distros nicht betroffen:

  • openSUSE (bereits verwendet -N)

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

Befürworter hätten dich ...

kehren Sie zum alten Format zurück, indem Sie -N zu ihrem Alias ​​hinzufügen

… Bei all Ihren Installationen überall für den Rest der Ewigkeit.

141
Jan Kyu Peblik

Sie können wählen Zitierstil :

ls --quoting-style=literal

Das Gleiche wie:

ls -N

oder:

QUOTING_STYLE=literal ls

Machen Sie es zu einem Alias ​​oder setzen Sie export QUOTING_STYLE=literal In Ihrem .bashrc, Um ein Verhalten vor 8.25 zu erreichen.

103
cuonglm

Ein paar Punkte zur Änderung.

  • Es wurde in Coreutils v8.25 eingeführt und die Ausrichtung in v8.26 verbessert
  • Dies geschieht nur bei der Ausgabe an Terminals, sodass keine Skripte beschädigt werden
  • Die Ausgabe für Benutzer für Dateien mit Leerzeichen wird eindeutig
  • Die Ausgabe wird bereinigt, sodass sicher kopiert und eingefügt werden kann
  • Die Ausgabe ist jetzt immer gültig, um sie zu kopieren und wieder in Shell einzufügen
  • Benutzer können zum alten Format zurückkehren, indem sie ihrem ls-Alias ​​-N hinzufügen
46
Pádraig Brady