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 | 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 werde ls
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.)
ls
Befehl nicht analysieren sollten .