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

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

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

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

83
задан 30 January 2018 в 20:52

5 ответов

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

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

info dir говорит:

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

Да, еще есть vdir ! info vdir говорит:

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

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

76
ответ дан 30 January 2018 в 20:52

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

2
ответ дан 30 January 2018 в 20:52

Хэрэв эргэлзээтэй байгаа бол type ls vs 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 хамгийн тод харагдах болно, таны систем өөр байж магадгүй юм.

3
ответ дан 30 January 2018 в 20:52

Мне кажется, что dir есть только для обратного хода. совместимость.

Из GNU Coreutils:

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

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

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

5
ответ дан 30 January 2018 в 20:52

The Relationship Between ls and dir

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

Существует два распространенных ошибочных представления о dir:

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

OK, но чем именно различаются ls и dir?

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

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

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

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

  2. Если стандартным выводом является терминал, а имя файла, который должен быть указан, содержит управляющие символы , то ls печатает ? вместо каждого управляющего символа (как ls -q). Когда его стандартный выход не является клеммой, ls печатает управляющие символы как есть (как ls - show control-chars).

    Независимо от того, является ли его стандартный вывод терминалом или нет, когда dir встречает управляющий символ или любой другой символ, который был бы специально интерпретирован, если бы он был введен в оболочку, он печатает последовательности обратного слеша для этих символов. Это включает в себя даже относительно общие символы, такие как пробелы. Например, dir перечислит запись под названием Document backups как Documents\ backups. Это как ls -b.

    Для обоих ls и dir эти значения по умолчанию могут быть переопределены флагами, перечисленными в 10.1.7 Форматирование имен файлов в справочном руководстве GNU coreutils GNU . Это включает в себя -b, -q, --quoting-style= и некоторые другие.

Sources: ls invocation и dir invocation, в справочном руководстве GNU coreutils .

Почему dir?

Обоснование отдельной утилиты dir приведено в 4.5 Стандартах интерфейсов в целом стандартов кодирования GNU . Я рекомендую прочитать этот раздел целиком, чтобы понять рассуждения разработчиков, но вот основные моменты, относящиеся к утилите ls/dir:

Пожалуйста, не делайте так, чтобы поведение утилиты зависело от имени, используемого для вызовите его....

Вместо этого используйте опцию времени выполнения или переключатель компиляции или оба для выбирайте среди альтернативных вариантов поведения....

Точно так же, пожалуйста, не делайте поведение программы из командной строки. зависит от типа выходного устройства....

Совместимость требует, чтобы определенные программы зависели от типа выходное устройство. Было бы катастрофическим, если бы ls или sh не сделали этого в как и ожидают все пользователи. В некоторых из этих случаев мы дополняем программа с предпочтительной альтернативной версией, не зависящей от тип выходного устройства. Например, мы предоставляем программу dir, очень похожую на ls за исключением того, что его выходной формат по умолчанию всегда многостолбцовый. Формат.

Проект GNU считает нежелательным, с технической точки зрения, чтобы утилита выдавала различные результаты в зависимости от того, на каком устройстве она пишет (по крайней мере, в конфигурации утилиты по умолчанию). Для некоторых утилит, включая ls, вывод, зависящий от устройства, необходим для совместимости, поэтому он работает так, как ожидают пользователи. Некоторые пользователи также предпочитают такое поведение, зависящее от устройства.

Хотя ls нельзя было записать для независимого поведения устройства, для этого была создана отдельная утилита dir. Таким образом, dir не является той утилитой, которая ведет себя странно по причинам исторической совместимости -ls is. Посмотреть, как ls, dir и связанная с ним vdir утилита реализованы в исходном коде coreutils без лишнего дублирования кода, можно в ls-dir. c, ls.c, ls.vdir.c, ls.h и ls.c.

Действительно ли dir полезен?

Если вы когда-либо хотели, чтобы ls выдавали многоколоночный вывод, даже если вы передали его в меньше (ls | меньше ) или перенаправили его в файл (ls > out.txt), вы можете использовать dir или ls -C.

Если Вы когда-либо хотели непосредственно скопировать имя файла, показанное в команде ls и использовать его как часть команды, не беспокоясь о цитировании , Вы можете использовать dir или ls -b.

dir эквивалентен ls -b, поэтому в этом смысле вам не нужен 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 или команду dir, то dir все равно будет выдавать независимый от устройства вывод. Это означает, что наложение псевдонима dir на dir --color=auto на самом деле не нарушает dir.
62
ответ дан 30 January 2018 в 20:52

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

Похожие вопросы: