Я пытался найти разницу между помощью dir
и ls
команды в терминале. Я знаю, что ls - это традиционный UNIX-метод просмотра файлов в каталоге, и это dir
эквивалент командной строки Windows, но обе команды работают в терминале.
Если я печатаю, dir
он отображает файлы и папки в каталоге, а если я печатаю, ls
он делает то же самое, за исключением выделения содержимого. Обе команды принимают опции (то есть ls -a
и dir -a
как вернуть все файлы и папки и скрытые файлы.
Так кто-нибудь знает, в чем разница и почему оба dir
и ls
используются?
command-line
directory
ls
coreutils
BretD
источник
источник
dir --color
;)Ответы:
dir
иls
являются частьюcoreutils
иdir
почти таким жеls
, только с различными параметрами по умолчанию.info dir
говорит:Ох и есть тоже
vdir
!info vdir
говорит:Скорее всего,
dir
существует для обратной совместимости или по историческим причинам.источник
alias dir
чтобы увидеть, что это на самом деле. типа,alias
чтобы увидеть все псевдонимы.type dir
чтобы увидеть, что это такое (псевдоним, команда, функция bash ...)Отношения между
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
:Проект 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
:Вы заметите, что
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
.источник
Источник: Ренан «s ответ на В чем разница между„режем“и„LS“ ?
источник
dir
это не предусмотрено для обратной совместимости - иls
фактически так и есть - этот ответ (и ответ, который он цитирует) действительно правильно указывает техническое различие между двумя командами, а также объясняет обычно наблюдаемую разницу в цвете. Итак +1.Если сомневаетесь, сравните
type ls
противtype dir
(см также разница между Лс LA ):Разница сводится к разным вариантам
ls
, в моем случае--color=tty
наиболее заметной может быть ваша система.источник
ls
псевдоним для вызываемой функции_ls
- даже не в закомментированной строке.bashrc
. Это выглядит по умолчанию для (по крайней мере, некоторых версий) openSuSE, хотя, судя по этому разговору , этот файл (связанный оттуда) и моя (предположительно, возможно, неправильная) память о том, когда я последний раз использовал openSUSE.Краткий ответ: Нет,
dir
исходный код тот жеls
, что и уls
двоичного файла--color
по умолчанию. (1 строка кода различий)источник
dir
это не псевдонимls
. Они представляют собой отдельные исполняемые файлы в/usr/bin
которые ведут себя по- разному, как описано в Rinzwind «s ответ . Вы можете достичь этого с помощью псевдонимов, но это не так, как это достигается. Отдельныеdir
иls
двоичные файлы появляются во всех системах, которые используют GNU Coreutils . Если вам нужны доказательства, бегитеcmp /bin/ls /bin/dir
.alias
, теперь новый двоичный файл скомпилирован для dir. Вы можете скачать его код:git clone git://git.sv.gnu.org/coreutils
. Только одна строка кода изменяется в LS-dir.c и заключается в следующем:int ls_mode = LS_MULTI_COL;
. Технически это не псевдоним, но практически это LS, но с другими параметрами по умолчанию (1 строка кода).dir
есть ,ls
но с различными параметрами по умолчанию .dir
иls
всегда были отдельными двоичными файлами в дистрибутивах, использующих GNU Coreutils. Некоторые дистрибутивы могут или могли также определять псевдоним, который называетсяdir
(определение псевдонимов с тем же именем, что и у существующей команды, довольно распространено). Но они являются отдельными исполняемыми файлами. Различие между псевдонимом оболочки (который вообще не является файлом) и отдельным исполняемым файлом со схожим исходным кодом не является педантичным различием. Это неверно и вводит в заблуждение, говоря, чтоdir
это псевдонимls
Ubuntu.alias
то из перечисленного, то, конечно, это не псевдоним.