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