Почему «ls» внезапно обматывает предметы пробелами в одинарных кавычках?

Я только заметил, что на одной из моих машин (под управлением Debian Sid), когда я набираю ls, любое имя файла с пробелами имеет одинарные кавычки, окружающие его.

Я сразу же проверял свои псевдонимы, только чтобы найти их неповрежденными.

[email protected]:~/testdir$ ls
'test 1.txt'  test1.txt
[email protected]:~/testdir$ alias
alias ls='ls --color=auto'
alias wget='wget --content-disposition'
[email protected]:~/testdir$

(рисунок)

Другой тест с файлами, содержащими одинарные кавычки в их именах (также отвечая на запрос jimmij):

[email protected]:~/testdir$ ls
'test 1.txt'  test1.txt  'thishasasinglequotehere'\''.txt'
[email protected]:~/testdir$ touch "'test 1.txt'"
[email protected]:~/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.

EDIT: Появляются разработчики coreutils, которые считали (ссылка) было бы неплохо сделать это глобальным дефолтом, несмотря на нарушение принцип наименьшего удивления , а также еще 46 лет традиции UNIX.

Любой способ исправить это без перекомпиляции?


UPDATE - октябрь 2017 г. - Debian Sid повторно включил кавычки оболочки, по умолчанию. Это просто смешно. https://bugs.debian.org/cgi-bin/bugreport.cgi ? ошибка = 877582

И в нижней части цепочки ответов к предыдущему отчету об ошибке «изменение было намеренным и останется». https://bugs.debian.org/cgi-bin/bugreport .cgi? ошибка = 813164 # 226

Я думал, что это было решено. Видимо, нет.

Обновление: Android toybox ls теперь делает что-то похожее на это, но с обратными косыми чертами вместо кавычек. Использование опции -q делает пробелы рендерингом в качестве символов вопросительного знака, поэтому единственное исправление, которое я нашел до сих пор, не укореняя данное устройство, заключается в том, чтобы добавить это в скрипт и указать его при запуске оболочки. Эта функция позволяет использовать столбцы ls, если в терминале и, в противном случае, печатать по одной строке, в то время как tricking ls дословно печатается, потому что он работает через канал.

ls() {
    # only way I can stop ls from escaping with backslashes
    if [ -t 1 ]; then
        /system/bin/ls -C "[email protected]" |cat
    else
        /system/bin/ls "[email protected]" |cat
    fi
}
129 голосов | спросил Wyatt8740 30 Jam1000000amSat, 30 Jan 2016 09:43:40 +030016 2016, 09:43:40

3 ответа


97

Предисловие . Хотя может быть вполне удовлетворительным, чтобы поддержать такой ответ и назвать его днем, пожалуйста, будьте уверены, что разработчики GNU не заботятся о голосовых ответах SO & что , если вы действительно хотите поощрять их изменять , вам нужно отправить их по электронной почте , как описывает этот ответ.


" Почему это происходит? "

Несколько разработчиков Coreutils решили, что они знают лучше десятилетних де-факто стандартов.


" Как я могу остановить его правильно? "

http://www.gnu.org/software/coreutils/coreutils.html :

  

Отчеты об ошибках

     

Если вы считаете, что обнаружили ошибку в Coreutils, отправьте ее как   завершите отчет об ошибке как <[email protected]> , и это   будет автоматически вводиться в трекер ошибок Coreutils. До   сообщите об ошибках, прочитав FAQ. Очень полезный и часто упоминаемый   руководство по написанию отчетов об ошибках и задание хороших вопросов - это   документ Как задавать вопросы Умный путь. Вы можете просматривать предыдущие   публикации и поиск архива ошибок-coreutils.

Distros, которые уже вернули , это изменение:

Неполадка Distros:

  • openSUSE (уже используется -N)

" Любой способ исправить это без перекомпиляции? "

Сторонники будут иметь вас ...

  

вернитесь в старый формат, добавив -N к их псевдониму ls

â € | на всех ваших установках, всюду, на оставшуюся часть вечности.

ответил Jan Kyu Peblik 14 FebruaryEurope/MoscowbSun, 14 Feb 2016 08:45:18 +0300000000amSun, 14 Feb 2016 08:45:18 +030016 2016, 08:45:18
57

Вы можете выбрать стиль цитаты :

ls --quoting-style=literal

То же, что:

ls -N

или

QUOTING_STYLE=literal ls

Сделайте псевдоним или установите export QUOTING_STYLE=literal в свой .bashrc, чтобы достичь пред-8.25 поведения.

ответил cuonglm 30 Jam1000000amSat, 30 Jan 2016 10:40:56 +030016 2016, 10:40:56
24

Несколько пунктов об изменении.

  • Он был введен в coreutils v8.25, а выравнивание улучшено в версии v.2.26
  • Это происходит только при выводе на терминалы, поэтому не нарушается сценарий
  • Он устраняет неоднозначность вывода для пользователей для файлов, содержащих пробелы.
  • Он очищает выходные данные, поэтому безопасно копировать и вставлять
  • Вывод теперь всегда действителен для копирования и вставки обратно в оболочку
  • Пользователи могут вернуться в старый формат, добавив -N к своему псевдониму ls
ответил Pádraig Brady 30 Jam1000000amSat, 30 Jan 2016 11:54:53 +030016 2016, 11:54:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132