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

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

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

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

5 ответов

Решение

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

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

info dir говорит:

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

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

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

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

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

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

Из GNU Coreutils:

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

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

Источник: ответ Wikusчем разница между" dir "и" ls "?

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

Если сомневаетесь, сравните type ls против type dir (см. также разницу между ls и 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 будет наиболее заметным, ваша система может отличаться.

Другие вопросы по тегам