Я щойно помітив, що на одній із моїх машин (під керуванням 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
}
ls | cat
і подивіться, чи пройде воно. Якби у мене була машина часу, я б повернувся до Bell Labs ~ 1970 року і спробував би переконати Кена Томпсона в тому, що дозволяти місця в іменах файлів і каталогів - це погана ідея. :-P
'*'
. Я думаю, я піду, додаючи ls
псевдоніми до всіх моїх машин, щоб позбутися від нього ...
QUOTING_STYLE=literal
а не псевдоніму. (Напевно, це питання смаку, але я віддаю перевагу змінній.)
ls
команду.