Зв'язок між ls
таdir
ls
і dir
це окремі програми, які поводяться аналогічно. Як пояснено і посилається нижче, мета dir
полягає в тому, щоб надати таку команду, як ls
вихід якої не змінюється залежно від того, йде він чи ні до терміналу . Щоб досягти цього корисно, dir
слід відформатувати його вихід таким чином, що є розумним і корисним як для перегляду в терміналі, так і для запису у файл або трубку.
Існує дві поширені помилки щодо dir
:
- Багато людей вважають
dir
, що це псевдонім ls
, але це не так. Жодна команда не є псевдонімом іншої, і за замовчуванням в Ubuntu dir
взагалі не є псевдонімом. 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 та виклик 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
.
dir --color
;)