Właśnie zauważyłem, że na jednym z moich komputerów (z uruchomionym Debianem Sid) zawsze, gdy wpisuję ls
dowolną nazwę pliku ze spacjami, otaczają ją pojedyncze cudzysłowy.
Natychmiast sprawdziłem swoje aliasy, ale znalazłem je nietknięte.
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$
Kolejny test z plikami zawierającymi pojedyncze cudzysłowy w ich nazwach (również odpowiadające na prośbę jimmij):
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'
aktualizacja z nowym wyjściem coreutils-8.26 (co jest wprawdzie o wiele mniej mylące, ale irytujące, że domyślnie). Dzięki Pádraig Brady za ten wydruk:
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
Dlaczego to się dzieje? Jak mam to właściwie zatrzymać?
dla wyjaśnienia, sam ustawiłem ls na automatyczne drukowanie w kolorze. Nigdy wcześniej nie wstawiał cytatów.
Jestem uruchomiony bash
i coreutils 8.25.
EDYCJA: Wydaje się, że programiści Coreutils myśleli (link) , że dobrym pomysłem byłoby uczynienie tego globalnym domyślnym, pomimo złamania zasady najmniejszego zdziwienia, a także ponad 46 lat tradycji UNIX.
Jakiś sposób to naprawić bez ponownej kompilacji?
AKTUALIZACJA - październik 2017 r. - Debian Sid ponownie domyślnie włączył cytowanie ucieczki powłoki. To staje się po prostu śmieszne. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
A u dołu łańcucha odpowiedzi na poprzedni raport o błędzie „zmiana była zamierzona i pozostanie”. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
Myślałem, że to załatwione. Najwyraźniej nie.
AKTUALIZACJA: kwiecień 2019: Właśnie znalazłem luksusowy raport o błędach w PHP, który został spowodowany przez tę zmianę w ls
. Kiedy mylisz programistów i generujesz fałszywe raporty o błędach, nadszedł czas, aby przemyśleć swoje zmiany.
Aktualizacja: Android toybox ls
robi teraz coś podobnego do tego, ale z cudzysłowami zamiast cudzysłowów. Użycie opcji -q powoduje, że spacje są renderowane jako „znaki zapytania” (nie sprawdziłem, co to są, ponieważ oczywiście nie są spacjami), więc jedyną poprawką, jaką znalazłem do tej pory bez rootowania danego urządzenia, jest dodanie to do skryptu i źródło podczas uruchamiania powłoki. Ta funkcja ls
korzysta z kolumn, jeśli jest w terminalu, i w inny sposób drukuje jeden na wiersz, jednocześnie wnikając ls
do spacji drukowanych dosłownie, ponieważ biegnie przez potok.
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
polecenia.ls | cat
i zobacz, czy to zniknie. Gdybym miał maszynę czasu, wróciłbym do Bell Labs ~ 1970 i próbował przekonać Kena Thompsona, że dopuszczanie miejsca w nazwach plików i katalogów to zły pomysł. :-P'*'
. Chyba sięls
rozejrzę, dodając pseudonimy do wszystkich moich maszyn, aby się ich pozbyć ...QUOTING_STYLE=literal
zamiast aliasu. (Myślę, że to kwestia gustu, ale wolę zmienną.)Odpowiedzi:
Przedmowa : Chociaż głosowanie nad odpowiedzią taką jak ta i nazwanie jej dniem może być całkiem satysfakcjonujące, zapewniamy, że programiści GNU nie dbają o głosy SO, a jeśli naprawdę chcesz zachęcić ich do zmiany , musisz: wyślij im e-mailem, jak opisuje ta odpowiedź.
„ Dlaczego tak się dzieje? ”
Kilku programistów Coreutils zdecydowało, że znają więcej niż dekady faktycznych standardów.
„ Jak to właściwie zatrzymać? ”
http://www.gnu.org/software/coreutils/coreutils.html :
Dystrybucje, które zostały już przywrócone tę zmianę:Debian coreutils-8.25-2W tym prawdopodobnie Ubuntu i wszystkie setki pochodnych Debiana i UbuntuZakłócenia nie ulegają zmianie:
„ Jakiś sposób to naprawić bez ponownej kompilacji? ”
Zwolennicy chcieliby, żebyś ...
… Na wszystkich twoich instalacjach, wszędzie, przez resztę wieczności.
źródło
ls
to, czego już nie widać, to sposób ich przechowywania. Ta funkcja powinna być opcjonalna, a nie domyślna.Możesz wybrać styl cytowania :
Taki sam jak:
lub:
Ustaw go jako alias lub ustaw
export QUOTING_STYLE=literal
w swoim,.bashrc
aby osiągnąć zachowanie sprzed 8.25.źródło
export QUOTING_STYLE=literal
w swoim bashrc.-N
, jak się wydaje. Właśnie kompiluję własną wersję, ponieważ mam już skonfigurowane osobiste repozytorium.literal
zamiastescape
(wierzę, że @cuonglm prostu chciał pokazać, jak zmienić styl, nie specjalnie targetting tenescape
styl).Kilka punktów na temat zmiany.
źródło
ls
złamać? Spójrz na te wszystkie argumenty przeciwko twojej zmianie. Nikt tego nie chce. Być może czas przeprosić świat i go cofnąć.