Зв'язок між 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;)