Я только что заметил, что на одном из моих компьютеров (на котором запущен Debian Sid) всякий раз, когда я ls
набираю имя файла с пробелами, его заключают в одинарные кавычки.
Я немедленно проверил свои псевдонимы, чтобы найти их нетронутыми.
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$
Другой тест, с файлами, содержащими одинарные кавычки в своих именах (также отвечая на запрос 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'
обновление с новым выходом coreutils-8.26 (который, по общему признанию, гораздо менее запутан, но по-прежнему раздражает иметь по умолчанию). Спасибо Pádraig Brady за эту распечатку:
$ ls
"'test 1.txt'" test1.txt
'test 1.txt' "thishasasinglequotehere'.txt"
$ ls -N
'test 1.txt' test1.txt
test 1.txt thishasasinglequotehere'.txt
Почему это происходит? Как мне остановить это правильно?
чтобы уточнить, я сам установил ls для автоматического вывода цвета. Это никогда не помещало кавычки вокруг вещей прежде.
Я бегу bash
и coreutils 8.25.
РЕДАКТИРОВАТЬ: Похоже, разработчики coreutils думали (ссылка), что было бы хорошей идеей сделать это глобальным дефолтом, несмотря на нарушение принципа наименьшего удивления, а также более чем 46-летней традиции UNIX.
Любой способ исправить это без перекомпиляции?
ОБНОВЛЕНИЕ - октябрь 2017 г. - Debian Sid по умолчанию снова включил экранирование оболочки. Это просто смешно. https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=877582
И в нижней части цепочки ответов на предыдущий отчет об ошибках «изменение было преднамеренным и останется». https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=813164#226
Я думал, что это было решено. Очевидно нет.
ОБНОВЛЕНИЕ: апрель 2019 г .: только что обнаружен внушительный отчет об ошибках в PHP, вызванный этим изменением ls
. Когда вы сбиваете с толку разработчиков и генерируете ложные сообщения об ошибках, пришло время переосмыслить ваши изменения.
Обновление: Android toybox ls
теперь делает нечто похожее на это, но с обратными слешами вместо кавычек. При использовании опции -q пробелы отображаются как «символы вопросительного знака» (я не проверял, какие они есть, поскольку они, очевидно, не пробелы), поэтому единственное исправление, которое я нашел до сих пор без рутирования рассматриваемого устройства, это добавить это в сценарий и источник его при запуске оболочки. Эта функция позволяет ls
использовать столбцы, если они находятся в терминале и, в противном случае, печатают по одной на строку, одновременно вводя ls
в заблуждение пространство печати, поскольку оно проходит через трубу.
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
и посмотрите, исчезнет ли это. Если бы у меня была машина времени, я бы вернулся к Bell Labs ~ 1970 и попытался бы убедить Кена Томпсона в том, что выделение места в именах файлов и каталогов - плохая идея. :-P
'*'
. Я думаю, что я буду добавлять ls
псевдонимы ко всем моим машинам, чтобы избавиться от них ...
QUOTING_STYLE=literal
а не псевдонима. (Я думаю, это дело вкуса, но я предпочитаю переменную.)
ls
команду.