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 | 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ą.)
ls
polecenia.