Разница между терминальными командами '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, Но это не тот случай. Ни одна из команд не является псевдонимом другой, и по умолчанию в Ubuntudirэто не псевдоним вообще.lsа такжеdirпредоставляются отдельными, не идентичными исполняемыми файлами. - Многие люди верят
dirсуществует по неясным историческим причинам или для обеспечения совместимости с некоторыми стандартными или некоторыми другими ОС. Это не так.lsведет себя так, как это делает для совместимости.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 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 будет наиболее заметным, ваша система может отличаться.