Связь между ls
и dir
ls
и dir
- отдельные программы, которые ведут себя аналогично. Как пояснялось и приведено ниже, цель dir
заключается в предоставлении команды типа ls
, выход которой не меняется в зависимости от того, идет ли она к терминалу . Для достижения этой цели dir
должно форматировать свой вывод таким образом, который является разумным и полезным как для просмотра в терминале, так и для записи в файл или канал.
Существует два распространенных заблуждения относительно dir
:
- Многие считают, что
dir
является псевдонимом ls
, но это не так. Ни одна из команд не является псевдонимом другого, и по умолчанию в Ubuntu dir
не является псевдонимом вообще. ls
и dir
предоставляются отдельными, не идентичными исполняемыми файлами.
- Многие люди считают, что
dir
существует для неясных исторических причин или для обеспечения совместимости с какой-то стандартной или какой-либо другой ОС. Это тоже не так. ls
ведет себя так, как это делает для compatibilty. 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 и 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
is (но не для dir
) .
Как мне сделать dir
также выдавать цветной вывод?
Чтобы включить цветной вывод с dir
, просто отредактируйте .bashrc
в своем домашнем каталоге и раскомментируйте #alias dir='dir --color=auto'
, удалив ведущий #
. В оболочках, запущенных после изменения, dir
будет псевдонимом.
Если вы хотите изменить текущую оболочку, вы можете запустить определение псевдонима в качестве команды, или вы можете указать .bashrc
, выполнив . ~/.bashrc
.
Это, пожалуй, противоречит основному моменту dir
- что он должен производить одинаковый вывод независимо от устройства вывода. Однако:
- Если вы считаете полезным сделать этот псевдоним
dir
, вы должны это сделать.
- При вызове в качестве внешней команды, например, в скриптах, или если вы переопределяете псевдоним, запустив
\dir
или command dir
, dir
будет по-прежнему выдавать независимый от устройства вывод. Это означает, что aliasing dir
to dir --color=auto
действительно не разбивает dir
.