Чому "ls" раптом загортає предмети пробілами в одинарні лапки?


187

Я щойно помітив, що на одній із моїх машин (під керуванням 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 (що, мабуть, набагато менш заплутано, але все ще дратує за замовчуванням). Дякуємо Падрайгу Брейді за цю роздруківку:

$ 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.

Будь-який спосіб виправити це без перекомпіляції?


ОНОВЛЕННЯ - жовтень 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-іграшка 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
}

20
Ще одна причина, чому не розібрати lsкоманду.
jimmij

12
Це виглядає дивним, але якщо це ввімкнено лише під час друку на терміналі, це має сенс. Ви чітко бачите, що у вас є файл 'test 1.txt', а не файл 'test' та інший '1.txt'. Спробуйте ls | catі подивіться, чи пройде воно. Якби у мене була машина часу, я б повернувся до Bell Labs ~ 1970 року і спробував би переконати Кена Томпсона в тому, що дозволяти місця в іменах файлів і каталогів - це погана ідея. :-P
Bjorn Munch

6
Коли я вперше побачив це, я злякався, думаючи, що один із моїх сценаріїв зіпсувався і перейменував усі мої файли в '*'. Я думаю, я піду, додаючи lsпсевдоніми до всіх моїх машин, щоб позбутися від нього ...
Обмежене Спокута

14
@LimitedAtonement, як вказував Лекенштейн , це можна зробити за допомогою змінної середовища, QUOTING_STYLE=literalа не псевдоніму. (Напевно, це питання смаку, але я віддаю перевагу змінній.)
LSpice

4
@BjornMunch Є два варіанти вирішення питання про те, чи є один файл чи два: 1) шукайте, як малюються стовпці, і це досить очевидно. 2) перерахуйте по одному елементу на рядок. Обидва вони виглядають краще і чіткіше, ніж маніпулювання єдиними цитатами.
Wyatt8740

Відповіді:


132

Вступ : Незважаючи на те, що такий варіант відповіді, як цей, може бути досить задоволенням і називати його щодня, будь ласка, будьте впевнені, що розробники GNU не піклуються про відповіді на голосування, і якщо ви дійсно хочете заохотити їх змінити , вам потрібно надішліть їм електронну пошту, як описано у цій відповіді.


" Чому це відбувається? "

Кілька розробників coreutils вирішили, що вони знають краще, ніж десятиліття де-факто стандартів.


" Як я це правильно зупинити? "

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

Звіти про помилки

Якщо ви думаєте, що ви знайшли помилку в Coreutils, то, будь ласка, надішліть якомога повніший звіт про помилку на <bug-coreutils@gnu.org> , і він автоматично буде введений у програму помилок Coreutils. Перш ніж повідомляти про помилки, будь ласка, прочитайте FAQ. Дуже корисним і часто посилається посібником про те, як писати звіти про помилки та задавати хороші запитання, є документ Як задавати питання Розумний шлях. Ви можете переглядати попередні публікації та шукати архів помилок-coreutils.

Дистрибутиви , які вже Відкинуті  це зміна:

Діти не зачеплені:

  • openSUSE (вже використано -N)

" Будь-який спосіб виправити це без перекомпіляції? "

Прихильники мали б вас ...

поверніться до старого формату, додавши -N до свого псевдоніма ls

… У всіх ваших установках, скрізь, до кінця вічності.


17
Ця зміна була запропонована у списку розсилки та узгоджена трьома сервісними службами, щоб отримати чисту користь. Ми цілком відкриті для цього конструктивні аргументи. Зрештою, це відкритий код, ми не маємо на увазі диктувати, а лише покращувати речі. Будь ласка, не соромтесь відповісти у програмі coreutils за посиланням list.gnu.org/archive/html/coreutils/2016-02/msg00000.html (BTW, до речі, була конструктивна пропозиція покращити один із згаданих там естетичних недоліків, додавши пробіл для поліпшення вирівнювання)
Pádraig Brady

31
@ PádraigBrady Оновлена ​​відповідь. Однак ви бачите навантаження заперечень у вашій потоці coreutils. Суть полягає в тому, що ви створюєте більше роботи для людей, і ви робите це в ім'я ОС, яка є клоном ОС з 1970 року. Якщо люди хочуть чогось іншого, вони приймуть рішення про це.
Ян Кю Пеблик

43
@ PádraigBrady Ця зміна викликала у мене роздратування і витрачала даремно кілька годин, намагаючись знайти причину та рішення. Я не маю на увазі негативу - я просто поділяю точку зору інших людей! Модифікація основної поведінки має величезні наслідки ..
mafrosis

52
Як хтось, хто використовує * nix системи протягом 30 років, я вважаю, що подібні зміни були дуже прикро. Вони порушують давні сценарії, для одного. Вони також порушують Принцип найменшого здивування. Тут, як зазначалося вище, повинен був бути типовим "опція".
Брайан Клаппер

28
@ PádraigBrady Це все ще не спосіб підштовхнути такі зміни. Це був би шлях більш конструктивним , щоб це поведінка неавтоматичного замість активної за замовчуванням. Це також помилково натякає на те, як зберігаються імена файлів, коротше кажучи, lsте, що ви більше не бачите, як це зберігається. Ця функція повинна бути необов'язковою, а не за замовчуванням.

91

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

ls --quoting-style=literal

Такий же як і:

ls -N

або:

QUOTING_STYLE=literal ls

Зробіть це псевдонімом або встановіть export QUOTING_STYLE=literalу своєму, .bashrcщоб досягти поведінки до 8,25.


11
здається трохи дивним, я повинен це зробити, щоб отримати нормальну поведінку Unix-y. Також я хочу старого за замовчуванням. Я не думаю, що втеча була старим за замовчуванням - я думаю, що вона надрукувала саме те, що було насправді.
Wyatt8740

9
Для поведінки до 8,25 використовуйте export QUOTING_STYLE=literalу своїй програмі bashrc.
Лекенштейн

2
або використовувати -N, здається. Я просто складаю свою власну версію, оскільки в мене вже створено персональний сховище.
Wyatt8740

2
@LSpice Я редагував публікацію literalзамість escape(я вважаю, що @cuonglm просто хотів показати, як змінити стиль, не конкретно орієнтуючись на escapeстиль).
Лекенштейн

5
Ця відповідь заслуговує на більшу кількість відгуків. Він прямо стосується того, що запитував запитувач, уникаючи бюрократичної відповіді. Дійсно, змінний підхід до навколишнього середовища здається досить елегантним. (Я особисто віддаю перевагу новій поведінці, оскільки вона сприяє більш ефективному дії C&P), проте, ls досить розумний, щоб поводитись по-старому, коли використовується перенаправлення, тому не шкода сценаріям, які використовують висновок ls.
Марсело

42

Кілька пунктів про зміну.

  • Він був введений у coreutils v8.25, а вирівнювання покращилось у v8.26
  • Це трапляється лише при виході на термінали, щоб не порушувати сценарії
  • Він роз’єднує вихід для користувачів для файлів, що містять пробіли
  • Він дезінфікує вихід , так що безпечно копіювати і вставляти
  • Вихідні дані завжди вірні для копіювання та вставки в оболонку
  • Користувачі можуть повернутися до старого формату, додавши -N до свого псевдоніма ls

7
мій останній приклад не є неоднозначним? Можливо, ні - але це, безумовно, заплутано і потребує більше часу, щоб розшифрувати. Я думаю, що це жахлива зміна (жодна образа не призначена для вас). Дякуємо за підказку псевдоніму.
Wyatt8740

27
Примітка: ця зміна була внесена в coreutils 8.25 ( фіксація , автор якої є тим самим Pádraig, що і цей пост). Особисто я вважаю, що така поведінка неоптимальна, вона порушує вирівнювання кожного разу, коли в назві файлу виникає пробіл.
Лекенштейн

10
мої вибачення - мабуть, ви сміливо цитуєте цитати оболонок, принаймні. мені все одно це не подобається. варіанти - це добре, але змінити дуже чітко визначену поведінку за замовчуванням десятилітньої основної утиліти Unix таким чином, що зменшує її правдивість, може бути лише поганою ідеєю.
mikeserv

12
@ PádraigBrady Отже, ти збираєшся тримати lsламану? Подивіться на всі ці аргументи проти вашої зміни. Ніхто цього не хоче. Можливо, прийшов час вибачитися перед світом і скасувати його.
Кріс Уоррік,

6
@ PádraigBrady Отже, незважаючи на безліч людей, які пояснили, що це неправильно, зламано тощо, ви все одно не повернете це, так що за замовчуванням не зміниться? Всупереч вашій думці, ця зміна бентежить, а не розмежовує. Запропонувати людині встановити змінну середовища або псевдонім - це асинін в кращому випадку.
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.