Почему ls заключает некоторые имена файлов в одинарные кавычки?

571
Hashim

Я заметил, что когда я делаю это lsв терминале, некоторые имена файлов заключаются в одинарные кавычки, а некоторые нет.

Мне не нравится, как это выглядит, так как я предпочитаю, чтобы мои выходные выводы были красивыми и однородными. Чем обусловлен этот функционал и можно ли его безопасно отключить?

Почему ls заключает некоторые имена файлов в одинарные кавычки?

2

1 ответ на вопрос

4
Hashim

Почему lsнекоторые имена файлов заключаются в одинарные кавычки?

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

Это была весьма непопулярна особенность введена в версии 8.25 от coreutilsпакета в начале 2016 года на основе консенсуса всего три разработчиков.

Аргументы, приведенные критиками изменения, заключаются в том, что это делает вывод lslook значительно более неприглядным, излишне расходится с почти полувековой традицией Unix и из-за того, как это было реализовано (отказ от подписки) нарушает совместимость. с давно существующими скриптами и утилитами.

Поскольку эта функция была представлена ​​в coreutilsпакете, от которого зависит практически каждый дистрибутив Linux и который lsявляется его частью, это изменение затрагивает все мыслимые системы Linux или Linux-подобных систем, от Arch Linux до Cygwin.

В случае с Debian и дистрибутивами, производными от Debian, такими как Ubuntu, изменение в какой-то момент было отменено после значительного протеста, а затем вновь восстановлено в октябре 2017 года .

Как ясно из этого ответа, лучший способ зарегистрировать свое разочарование в связи с этим изменением - связаться с coreutilsразработчиками напрямую через сообщение об ошибке и (вежливо) привести аргумент, что они допустили огромную ошибку. Согласно принципам открытого исходного кода, критической массы пользователей, уважительно, но непреклонно настаивающих на том, что способ lsповедения, используемый должным образом, должен быть восстановлен, теоретически должно быть достаточно, чтобы убедить coreutilsразработчиков прислушиваться к сообществу Linux.

В более краткосрочном, прагматическом смысле, есть несколько способов, которыми вы можете восстановить ls« поведение до версии 8.25, оставив все выходные данные нетронутыми. Ниже приведены три способа сделать это для bashоболочки.


Восстановление поведения lsдо версии 8.25

Установите QUOTING_STYLEпеременную окружения literalв вашем ~/.bashrcфайле

Найдите свой ~/.bashrcфайл в папке HOME ( /home/yourusername) и добавьте в него следующую строку:

export QUOTING_STYLE=literal 

Сохраните файл, и изменения должны немедленно применяться ко всем новым bashтерминалам, которые вы открываете.

Вы также можете запустить, source ~/.bashrcчтобы изменения были перенесены в любые окна терминала, которые были открыты во время внесения изменений.

Создать псевдоним для ls -N

Если вы предпочитаете псевдонимы переменным окружения, вы также можете создать псевдоним, в .bashrcкотором используется новый -Nпереключатель 8.25 . От ls --help:

-N, --literal печатать имена записей без кавычек

Для этого добавьте в свой ~/.bashrcфайл следующую строку и сохраните ее:

alias ls="ls -N" 

Запустите, source ~/.bashrcчтобы новое изменение было передано на все открытые клеммы.

Используйте -Nпереключатель командной строки (только для текущего запуска)

Если вы предпочитаете coreutilsновое поведение по умолчанию, но хотите временно его обойти, вы также можете использовать -Nпереключатель непосредственно в команде:

ls -N 
Я не собирался быть пассивно-агрессивным, но, поскольку вы восприняли мой комментарий как таковой, возможно, я был. Мои извинения, комментарий удален. Я искренне проголосовал за ответ и вопрос, это означает, что я думаю, что они полезны здесь на SU. Kamil Maciorowski 5 лет назад 1

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