Отношения между lsиdir
lsи dirотдельные программы, которые ведут себя аналогично. Как объясняется и упоминается ниже, цель dirсостоит в том, чтобы предоставить команду, lsчей вывод не изменяется в зависимости от того, идет ли он на терминал . Чтобы этого добиться, dirнеобходимо отформатировать вывод таким образом, чтобы он был разумным и полезным как для просмотра в терминале, так и для записи в файл или канал.
Есть два распространенных заблуждения о dir:
- Многие люди считают
dirэто псевдонимом ls, но это не так. Ни одна из команд не является псевдонимом другой, и по умолчанию в Ubuntu dirвообще не является псевдонимом. lsи dirпредоставляются отдельными, не идентичными исполняемыми файлами.
- Многие считают, что
dirсуществует по неясным историческим причинам или для обеспечения совместимости с некоторыми стандартными или некоторыми другими ОС. Это не так. lsведет себя так, как это делает для совместимости. dir, который не должен быть совместимым, потому что это не стандартная команда Unix, ведет себя альтернативным образом, который разработчики считают ценным сами по себе и, возможно, даже предпочтительным.
Хорошо, но как именно lsи dirотличаются?
Оба lsи dirперечислите содержимое каталогов. Два конкретных различия в их поведении по умолчанию отличают их.
Когда его стандартным выводом является терминал, lsперечисляются имена файлов в вертикально отсортированных столбцах (например ls -C). Когда его стандартный вывод не является терминалом (например, файлом или каналом ), lsперечисляет имена файлов по одному на строку (например ls -1).
Независимо от того, является ли его стандартный вывод терминалом, dirперечисляются имена файлов в вертикально отсортированных столбцах (например ls -C).
Для обоих lsи dirэти значения по умолчанию могут быть переопределены --format=флагом и с помощью -1, -C, -mи -xфлаги, которые сокращайте конкретные --format=варианты. Подробности см. В разделе 10.1.4 Общее форматирование вывода в справочном руководстве по GNU coreutils .
Когда его стандартный вывод является терминалом, а имя файла, которое должно быть указано, содержит управляющие символы , вместо каждого управляющего символа lsпечатается ?(например ls -q). Когда его стандартный вывод не является терминалом, lsпечатает управляющие символы как есть (как ls --show-control-chars).
Независимо от того, является ли его стандартный вывод терминалом, когда он dirвстречает управляющий символ или любой другой символ, который будет интерпретирован специально, если он введен в оболочку, он печатает последовательности обратной косой черты для символов. Это включает даже относительно общие символы, такие как пробелы. Например, dirбудет перечислять запись с именем Documents backupsкак Documents\ backups. Это как ls -b.
Для обоих lsи dirэти значения по умолчанию могут быть переопределены флагами, перечисленными в 10.1.7 Форматирование имен файлов в справочном руководстве по GNU coreutils . Это включает в себя -b, -q, --quoting-style=и некоторые другие.
Источники : ls invocation и dir invocation , в справочном руководстве по GNU coreutils .
Почему есть dir?
Обоснование для отдельной dirутилиты приведено в 4.5 стандартов для интерфейсов Вообще из стандартов кодирования GNU . Я рекомендую прочитать весь этот раздел, чтобы понять аргументы разработчиков, но вот основные моменты, применимые к ls/ dir:
Пожалуйста, не делайте поведение утилиты зависимым от имени, используемого для ее вызова ....
Вместо этого используйте параметр времени выполнения или переключатель компиляции или оба, чтобы выбрать среди альтернативных вариантов поведения ....
Точно так же, пожалуйста, не ставьте поведение программы командной строки в зависимости от типа устройства вывода ....
Совместимость требует, чтобы определенные программы зависели от типа устройства вывода. Было бы катастрофическим, если бы lsили shне сделали так, как ожидают все пользователи. В некоторых из этих случаев мы дополняем программу предпочтительной альтернативной версией, которая не зависит от типа устройства вывода. Например, мы предоставляем dirпрограмму, похожую на
lsту, за исключением того, что формат вывода по умолчанию всегда является многостолбцовым.
Проект GNU считает нежелательным, с технической точки зрения, чтобы утилита производила различный вывод в зависимости от того, на какое устройство она пишет (по крайней мере, в конфигурации утилиты по умолчанию). Для некоторых утилит, в том числе ls, зависимый от устройства вывод необходим для совместимости, и поэтому он работает так, как ожидают пользователи. Некоторые пользователи также предпочитают это поведение, зависящее от устройства.
В то время как lsневозможно разумно написать, что устройство будет работать независимо, dirдля этого была создана отдельная утилита. Таким образом dir, не утилита, которая ведет себя странно по причинам исторической совместимости ls- есть .
Чтобы увидеть , как ls, dirи соответствующую vdirутилита реализована в Coreutils исходного кода без ненужного дублирования кода, см ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, и ls.c.
Это dirдействительно полезно?
Если вы когда-нибудь хотели lsполучить многостолбцовый вывод, даже когда отправили его в less( ls | less) или перенаправили в файл ( ls > out.txt), вы можете использовать dirили ls -C.
Если вы когда-нибудь хотели, чтобы вы могли напрямую скопировать имя файла, отображаемое с помощью lsи использовать его как часть команды, не беспокоясь о цитировании , вы можете использовать dirили ls -b.
dirэквивалентно ls -Cb, так что в этом смысле вам не нужно dir. Но dirпредоставляет комбинацию опций, которая на практике часто бывает полезна (хотя о ней широко не известно).
Почему я получаю цветной вывод ls(даже ls -Cb), а не dir?!
У большинства пользователей Ubuntu есть псевдоним, lsкоторый называется « работает» ls --color=auto. Если lsсуществует как псевдоним, так и внешняя команда, псевдоним имеет приоритет в простых интерактивных командах.
Определения псевдонимов не расширяются рекурсивно - это внешняя lsкоманда, с lsкоторой вызывается псевдоним --color=auto. См. 6.6 Псевдонимы в справочном руководстве Bash для получения дополнительной информации о том, как работают псевдонимы.
При переходе к ls, dirили vdir(и некоторые другие команды, такие как grep), --color=autoиспользует цвет , когда его выход представляет собой терминал, но не иначе.
По умолчанию в Ubuntu учетные записи пользователей создаются следующим образом ~/.bashrc:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
Вы заметите, что lsпсевдоним ( alias ls='ls --color=auto') не комментируется , тогда как для dirи vdirзакомментированы, #поэтому они не действуют. То есть, пока dirне псевдоним, lsесть (но не для dir) .
Как сделать так, чтобы dirцветная продукция тоже была?
Чтобы включить цветной вывод с помощью dir, просто отредактируйте .bashrcв своем домашнем каталоге и раскомментируйте #alias dir='dir --color=auto'строку, удалив начальную строку #. В оболочках, запущенных после изменения, dirбудет псевдоним.
Если вы хотите внести изменения в текущую оболочку, вы можете запустить определение псевдонима как команду или получить источник .bashrc, запустив . ~/.bashrc.
Это, возможно, идет вразрез с основным dirутверждением о том, что он должен производить одинаковый вывод независимо от устройства вывода. Тем не мение:
- Если вы считаете полезным создать этот
dirпсевдоним, вам, безусловно, следует это сделать.
- При вызове в качестве внешней команды, например, в сценариях или при переопределении псевдонима с помощью команды
\dirили command dir, dirвсе равно будет производиться независимый от устройства вывод. Это означает, что псевдонимы dirна dir --color=autoсамом деле не ломаются dir.
dir --color;)