Отношения между 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
;)