Разница между терминальными командами 'dir' и 'ls'?

74

Я пытался найти разницу между помощью dirи lsкоманды в терминале. Я знаю, что ls - это традиционный UNIX-метод просмотра файлов в каталоге, и это dirэквивалент командной строки Windows, но обе команды работают в терминале.

Если я печатаю, dirон отображает файлы и папки в каталоге, а если я печатаю, lsон делает то же самое, за исключением выделения содержимого. Обе команды принимают опции (то есть ls -aи dir -aкак вернуть все файлы и папки и скрытые файлы.

Так кто-нибудь знает, в чем разница и почему оба dirи lsиспользуются?

BretD
источник
7
dir --color;)
Rinzwind
3
Просто хотел сказать, что я удивлен количеством ответа на этот вопрос. Я думаю, я был не единственным, кто задавался вопросом об этом :)
BretD
3
Команды с древних времен всегда вытаскивают старших ботанов из дерева;)
Rinzwind

Ответы:

70

dirи lsявляются частью coreutilsи dirпочти таким же ls, только с различными параметрами по умолчанию.

Утилиты GNU Core - это базовые утилиты для работы с файлами, оболочками и текстом в операционной системе GNU. Это основные утилиты, которые, как ожидается, существуют в каждой операционной системе.

info dir говорит:

dirэквивалентно ls -C -b; то есть по умолчанию файлы перечислены в столбцах, отсортированы по вертикали, а специальные символы представлены escape-последовательностями с обратной косой чертой.

Ох и есть тоже vdir! info vdirговорит:

vdirэквивалентно ls -l -b; то есть по умолчанию файлы перечислены в длинном формате, а специальные символы представлены escape-последовательностями с обратной косой чертой.

Скорее всего, dirсуществует для обратной совместимости или по историческим причинам.

Rinzwind
источник
Я думал, что это, вероятно, просто псевдоним другого. Я предполагал, что причина в том, чтобы пользователи Windows чувствовали себя как дома. Спасибо за подробный ответ!
BretD
4
типа, alias dirчтобы увидеть, что это на самом деле. типа, aliasчтобы увидеть все псевдонимы.
user606723
2
@ user606723, 'alias dir' не отображается в 11.10 (по крайней мере, не для меня). Я считаю, что «псевдоним» показывает только настройки псевдонимов локальных пользователей, а не всей системы.
Джеймс
введите, type dirчтобы увидеть, что это такое (псевдоним, команда, функция bash ...)
ychaouche
49

Отношения между lsиdir

lsи dirотдельные программы, которые ведут себя аналогично. Как объясняется и упоминается ниже, цель dirсостоит в том, чтобы предоставить команду, lsчей вывод не изменяется в зависимости от того, идет ли он на терминал . Чтобы этого добиться, dirнеобходимо отформатировать вывод таким образом, чтобы он был разумным и полезным как для просмотра в терминале, так и для записи в файл или канал.

Есть два распространенных заблуждения о dir:

  • Многие люди считают dirэто псевдонимом ls, но это не так. Ни одна из команд не является псевдонимом другой, и по умолчанию в Ubuntu dirвообще не является псевдонимом. lsи dirпредоставляются отдельными, не идентичными исполняемыми файлами.
  • Многие считают, что dirсуществует по неясным историческим причинам или для обеспечения совместимости с некоторыми стандартными или некоторыми другими ОС. Это не так. lsведет себя так, как это делает для совместимости. dir, который не должен быть совместимым, потому что это не стандартная команда Unix, ведет себя альтернативным образом, который разработчики считают ценным сами по себе и, возможно, даже предпочтительным.

Хорошо, но как именно lsи dirотличаются?

Оба lsи dirперечислите содержимое каталогов. Два конкретных различия в их поведении по умолчанию отличают их.

  1. Когда его стандартным выводом является терминал, lsперечисляются имена файлов в вертикально отсортированных столбцах (например ls -C). Когда его стандартный вывод не является терминалом (например, файлом или каналом ), lsперечисляет имена файлов по одному на строку (например ls -1).

    Независимо от того, является ли его стандартный вывод терминалом, dirперечисляются имена файлов в вертикально отсортированных столбцах (например ls -C).

    Для обоих lsи dirэти значения по умолчанию могут быть переопределены --format=флагом и с помощью -1, -C, -mи -xфлаги, которые сокращайте конкретные --format=варианты. Подробности см. В разделе 10.1.4 Общее форматирование вывода в справочном руководстве по GNU coreutils .

  2. Когда его стандартный вывод является терминалом, а имя файла, которое должно быть указано, содержит управляющие символы , вместо каждого управляющего символа 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.
Элия ​​Каган
источник
Качественный ответ, но можно использовать ToC или TL; DR; :)
Кевин
5

Я был бы склонен думать, что dirэто только для обратной совместимости .

Из GNU Coreutils :

dir эквивалентен ls -C -b; то есть по умолчанию файлы перечислены в столбцах, отсортированы по вертикали, а специальные символы представлены escape-последовательностями с обратной косой чертой.

Кстати, lsне раскрасить выход по умолчанию: это потому , что большинство дистрибутивов псевдонима lsдля ls --color=autoв /etc/profile.d. Для теста введите и unalias lsпопробуйте ls: он будет бесцветным.

Источник: Ренан «s ответ на В чем разница между„режем“и„LS“ ?

Златан
источник
Хотя dirэто не предусмотрено для обратной совместимости - и lsфактически так и есть - этот ответ (и ответ, который он цитирует) действительно правильно указывает техническое различие между двумя командами, а также объясняет обычно наблюдаемую разницу в цвете. Итак +1.
Элия ​​Каган
3

Если сомневаетесь, сравните type lsпротив type dir(см также разница между Лс LA ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

Разница сводится к разным вариантам ls, в моем случае --color=ttyнаиболее заметной может быть ваша система.

user2394284
источник
2
Это совсем не похоже на пользовательскую конфигурацию Ubuntu по умолчанию. Я не думаю, что какая-либо из систем Ubuntu, которую я использовал, имела lsпсевдоним для вызываемой функции _ls- даже не в закомментированной строке .bashrc. Это выглядит по умолчанию для (по крайней мере, некоторых версий) openSuSE, хотя, судя по этому разговору , этот файл (связанный оттуда) и моя (предположительно, возможно, неправильная) память о том, когда я последний раз использовал openSUSE.
Элия ​​Каган
2
@EliahKagan: Как вы уже догадались, я использую OpenSuse! Как я уже сказал, результат будет отличаться, но метод должен быть в порядке.
user2394284
2

Краткий ответ: Нет, dirисходный код тот же ls, что и у lsдвоичного файла --colorпо умолчанию. (1 строка кода различий)

Франсиско Вальдес
источник
7
dirэто не псевдоним ls. Они представляют собой отдельные исполняемые файлы в /usr/binкоторые ведут себя по- разному, как описано в Rinzwind «s ответ . Вы можете достичь этого с помощью псевдонимов, но это не так, как это достигается. Отдельные dirи lsдвоичные файлы появляются во всех системах, которые используют GNU Coreutils . Если вам нужны доказательства, бегите cmp /bin/ls /bin/dir.
Элия ​​Каган
2
Некоторое время назад это был псевдоним, и вы могли увидеть его в списке псевдонимов, просто набрав alias, теперь новый двоичный файл скомпилирован для dir. Вы можете скачать его код: git clone git://git.sv.gnu.org/coreutils. Только одна строка кода изменяется в LS-dir.c и заключается в следующем: int ls_mode = LS_MULTI_COL;. Технически это не псевдоним, но практически это LS, но с другими параметрами по умолчанию (1 строка кода).
Франциско Вальдес
1
Да, dirесть , lsно с различными параметрами по умолчанию . dirи lsвсегда были отдельными двоичными файлами в дистрибутивах, использующих GNU Coreutils. Некоторые дистрибутивы могут или могли также определять псевдоним, который называется dir(определение псевдонимов с тем же именем, что и у существующей команды, довольно распространено). Но они являются отдельными исполняемыми файлами. Различие между псевдонимом оболочки (который вообще не является файлом) и отдельным исполняемым файлом со схожим исходным кодом не является педантичным различием. Это неверно и вводит в заблуждение, говоря, что dirэто псевдоним lsUbuntu.
Элия ​​Каган
Да, я согласен с вами, но в данном случае это не похожий исходный код, это тот же исходный код. Если мы говорим, что псевдоним - это просто что- aliasто из перечисленного, то, конечно, это не псевдоним.
Франциско Вальдес
3
Это не тот же исходный код. Как вы сказали, «одна строка источника изменена». И если бы это был тот же источник, то он все равно не был бы псевдонимом. В Unix-подобной системе есть много вещей, которые похожи на псевдонимы, но которые могут ввести в заблуждение новичков (и раздражать опытных пользователей) для вызова псевдонимов. Символьные ссылки, жесткие ссылки, идентичные файлы, аналогичные файлы, скрипты-оболочки, встроенные оболочки, скрывающие исполняемые файлы и синхронизированные файлы (например, с UbuntuOne), во многом похожи на псевдонимы, но они не являются псевдонимами.
Элия ​​Каган