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

60

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

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

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

    
задан BretD 13.02.2012 в 19:15
источник

5 ответов

54

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

  

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

info dir говорит:

  

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

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

  

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

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

    
ответ дан Rinzwind 13.02.2012 в 19:33
источник
33

Связь между ls и dir

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

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

  • Многие считают, что dir является псевдонимом ls , но это не так. Ни одна из команд не является псевдонимом другого, и по умолчанию в Ubuntu dir не является псевдонимом вообще. ls и dir предоставляются отдельными, не идентичными исполняемыми файлами.
  • Многие люди считают, что dir существует для неясных исторических причин или для обеспечения совместимости с какой-то стандартной или какой-либо другой ОС. Это тоже не так. ls ведет себя так, как это делает для compatibilty. 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 и 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 .
ответ дан Eliah Kagan 29.04.2015 в 18:15
4
  

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

     

Из GNU Coreutils :

     
    

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

  
     

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

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

    
ответ дан Zlatan 14.09.2013 в 18:40
2

Короткий ответ: Нет, dir является псевдонимом ls , поскольку @Rinzwind сказал, ls имеют --color по умолчанию

    
ответ дан Francisco Valdez 13.02.2012 в 19:26
2

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

    
ответ дан user2394284 22.12.2016 в 22:45