Різниця між командами 'dir' та 'ls'?


74

Я намагався знайти різницю між використанням dirта lsкомандами в терміналі. Я знаю Ls є традиційним методом UNIX перегляду файлів в каталозі, і що dirце вікно командного рядка еквівалента, але обидва команд працюють в терміналі.

Якщо я вводжу, dirвін відображає файли та папки в каталозі, а якщо я вводить, lsце робить те саме, за винятком виділення вмісту. Обидві команди приймають опції (тобто ls -aі dir -aяк повернути всі файли і папки і приховані файли.

Так хтось знає, в чому різниця і чому обидва dirі lsвикористовуються?


7
dir --color;)
Rinzwind

3
просто хотів сказати, що я здивований кількістю відповіді на це запитання. Напевно, я був не єдиний, хто цікавився з цього питання :)
BretD

3
Команди з давніх часів завжди тягнуть старших ботаніків з дерев’яних виробів;)
Rinzwind

Відповіді:


70

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

Основні утиліти GNU - це основні утиліти для управління файлами, оболонками та текстами операційної системи GNU. Це основні утиліти, які, як очікується, будуть існувати в кожній операційній системі.

info dir каже:

dirеквівалентно ls -C -b; тобто файли за замовчуванням перераховані в стовпці, відсортовані по вертикалі, а спеціальні символи представлені послідовними відхиленнями зворотної косої лінії.

Ох і є теж vdir! info vdirкаже:

vdirеквівалентно ls -l -b; тобто файли за замовчуванням перераховані у довгому форматі, а спеціальні символи представлені послідовними зворотними косою послідовності.

Швидше за все, це dirіснує внаслідок зворотної сумісності або через історичні причини.


Я думав, що це, мабуть, просто псевдонім іншого. Я припустив, що міркування полягають у тому, щоб користувачі Windows почували себе більше вдома, хай дякую за ретельну відповідь!
BretD

4
введіть, alias dirщоб побачити, що це насправді. введіть, aliasщоб побачити всі псевдоніми.
користувач606723

2
@ user606723, "псевдонім dir" не відображається в 11.10 (принаймні, не для мене). Я вважаю, що "псевдонім" показує лише локальні налаштування псевдонімів користувачів, а не для системи.
Джеймс

наберіть, type dirщоб побачити, що це (псевдонім, команда, функція bash ...)
ychaouche

49

Зв'язок між lsтаdir

lsі dirце окремі програми, які поводяться аналогічно. Як пояснено і посилається нижче, мета dirполягає в тому, щоб надати таку команду, як lsвихід якої не змінюється залежно від того, йде він чи ні до терміналу . Щоб досягти цього корисно, dirслід відформатувати його вихід таким чином, що є розумним і корисним як для перегляду в терміналі, так і для запису у файл або трубку.

Існує дві поширені помилки щодо dir:

  • Багато людей вважають dir, що це псевдонім ls, але це не так. Жодна команда не є псевдонімом іншої, і за замовчуванням в Ubuntu dirвзагалі не є псевдонімом. lsі dirнадаються окремими, не ідентичними виконуваними файлами.
  • Багато людей вважають, що dirіснує з незрозумілих історичних причин або для забезпечення сумісності з якоюсь стандартною чи іншою ОС. Це теж не так. lsповодиться так, як це робить для сумісності. 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 , у довідковому посібнику з 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.

Якість відповіді, але міг би використовувати ToC або TL; DR; :)
Кевін

5

Я схильний би думати, що dirіснує лише задля зворотної сумісності .

Від GNU Coreutils :

dir еквівалентно ls -C -b; тобто файли за замовчуванням перераховані в стовпці, відсортовані по вертикалі, а спеціальні символи представлені послідовними відхиленнями зворотної косої лінії.

До речі, lsНЕ розфарбувати вихід за замовчуванням: це тому , що більшість дистрибутивів псевдоніма lsдля ls --color=autoв /etc/profile.d. Для тесту введіть, unalias lsа потім спробуйте ls: він буде безбарвним.

Джерело: Ренан «s відповідь на В чому різниця між" ріжемо "і" LS " ?


Хоча dirце НЕ передбачений для забезпечення сумісності х на lsнасправді є --this відповіді (і відповіді він цитує) неправильно сформулювати технічне відмінність між цими двома командами, а також пояснити різницю зазвичай спостерігається розфарбовування. Так +1.
Елія Каган

3

Якщо ви сумніваєтеся, порівняйте 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було б найбільш видно, ваша система може відрізнятися.


2
Це зовсім не схоже на конфігурацію користувача Ubuntu за замовчуванням. Я не думаю, що жодна із систем Ubuntu, яку я використовував, не мала lsпсевдоніму для функції, яка називається _ls- навіть не як коментований рядок в .bashrc. Здається, за замовчуванням для (принаймні деяких версій) openSuSE, хоча, судячи з цієї розмови , цей файл (зв'язаний звідти), і моя (правда, можливо, неправильна) пам’ять про те, коли я востаннє використовував openSUSE.
Елія Каган

2
@EliahKagan: Ви здогадалися, я використовую OpenSuse! Отже, як я вже сказав, результат буде відрізнятися, але з методом має бути все в порядку.
user2394284

2

Короткий відповідь: Жодна, dirвихідний код є тим самим вихідним кодом ls, що і lsбінарний код --colorза замовчуванням. (1 рядок коду різн.)


7
dirце НЕ псевдонім ls. Вони представляють собою окремі виконувані файли в /usr/binякі поводяться по- різному, як описано в Rinzwind «s відповідь . Ви могли б досягти цього за допомогою псевдонімів, але це не так, як це досягається. Окремі dirта lsдвійкові файли з'являються у всіх системах, які використовують GNU Coreutils . Якщо вам потрібен доказ, біжіть cmp /bin/ls /bin/dir.
Eliah Каган

2
деякий час тому це було псевдонімом, і ви можете побачити його, вказане у списку псевдонімів, просто набравши текст alias, тепер для dir складається новий двійковий файл. Ви можете завантажити його код: git clone git://git.sv.gnu.org/coreutils. Тільки один рядок коду змінюється в LS-dir.c і полягає в наступному: int ls_mode = LS_MULTI_COL;. Технічно це не псевдонім, але практично це LS, але з різними параметрами за замовчуванням (1 рядок коду).
Франциско Вальдес

1
Так, dirє, lsале з різними параметрами за замовчуванням . dirі lsзавжди були окремими бінарними файлами в дистрибутивах, які використовують GNU Coreutils. Деякі дистрибутиви можуть, або можуть мати, також визначено псевдонім з ім'ям dir(визначення псевдонімів, які таким же ім'ям , як існуюча команда досить часто). Але вони є окремими виконуваними файлами. Розрізняти псевдонім оболонки (який зовсім не файл) та окремий виконуваний файл з подібним вихідним кодом, не є педантичним розрізненням. Сказати, що dirце псевдонім lsUbuntu, є помилковим і оманливим .
Елія Каган

Так, я згоден з вами, але в цьому випадку не схожий вихідний код, це той самий вихідний код. Якщо ми скажемо, що псевдонім - це все, що перераховано, aliasто, звичайно, це не псевдонім.
Франциско Вальдес

3
Це не той самий вихідний код. Як ви сказали, "один рядок джерела змінено". І якби це було одне джерело, то це все одно не було б псевдонімом. У системі, подібній псевдонімам, є багато речей, схожих на псевдоніми, але які б дуже заплутали новаків (і дратують досвідчених користувачів) називати псевдоніми. Символічні посилання, жорсткі посилання, однакові файли, подібні файли, сценарії обгортки, вбудовані в оболонки, що приховують виконувані файли, і синхронізовані файли (наприклад, з UbuntuOne) - істотно схожі на псевдоніми, але вони не є псевдонімами.
Елія Каган
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.