Mir ist gerade aufgefallen, dass auf einem meiner Computer (auf dem Debian Sid ausgeführt wird), wenn ich ls
einen 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$
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'
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 bash
und 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 ls
macht 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 ls
verwendet Spalten, wenn sie sich in einem Terminal befinden, und gibt ansonsten eine Zeile pro Zeile aus, während sie ls
wö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
}
ls
Befehl nicht analysieren sollten .ls | cat
und 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'*'
. Ich schätze, ich werdels
alle meine Maschinen mit Aliasen versehen, um sie loszuwerden ...QUOTING_STYLE=literal
anstelle eines Alias tun . (Ich denke, es ist Geschmackssache, aber ich bevorzuge die Variable.)Antworten:
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 :
Distros, die diese Änderung bereits rückgängig gemacht haben:Debian coreutils-8.25-2Infolgedessen vermutlich auch Ubuntu und alle Hunderte von auf Debian und Ubuntu basierenden DerivatenDistros nicht betroffen:
Msgstr " Irgendeine Möglichkeit, dies ohne Neukompilierung zu beheben? "
Befürworter hätten Sie ...
… Auf allen Ihren Installationen, überall, für den Rest der Ewigkeit.
quelle
ls
was Sie sehen, ist nicht mehr, wie es gespeichert wird. Diese Funktion sollte optional sein, nicht die Standardeinstellung.Sie können den Anführungsstil auswählen :
Das Gleiche wie:
oder:
Machen Sie es zu einem Alias oder legen
export QUOTING_STYLE=literal
Sie es fest.bashrc
, um ein Verhalten vor 8.25 zu erreichen.quelle
export QUOTING_STYLE=literal
Sie für Verhalten vor 8.25 in Ihrem bashrc.-N
, so scheint es. Ich kompiliere gerade meine eigene Version, da ich bereits ein persönliches Repository eingerichtet habe.literal
stattescape
(ich glaube , dass @cuonglm wollte nur zeigen , wie die Art zu ändern, nicht speziell den Targeting -escape
Stil).Ein paar Punkte zur Veränderung.
quelle
ls
kaputt 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.