Що робить команда l?


19

На lмоїй машині є команда, яка, здається, нічого не робить. which lтакож не дає виходу. Це реальна команда, і чи справді вона робить щось?

Відповіді:


20

lце псевдонім для ls -CF, який веде себе інакше, ніж звичайнийls .

-C

-Cробить lsдрук виводу у формі стовпця. Коли stdout є терміналом (замість того, щоб перенаправлятись на файл або нетермінальний пристрій або переносити на іншу команду), -Cмається на увазі. Отже біг ls -C- це те саме, що біг ls. Але вони не рівноцінні, коли lsвони переспрямовуються або переносяться. Наприклад:

ek@Kip:~/firefox$ ls
application.ini             libfreebl3.chk    libxpcom.so
blocklist.xml               libfreebl3.so     libxul.so
chrome                      libmozalloc.so    mozilla-xremote-client
chrome.manifest             libmozsqlite3.so  omni.ja
components                  libnspr4.so       platform.ini
crashreporter               libnss3.so        plugin-container

...

ek@Kip:~/firefox$ ls | less

application.ini
blocklist.xml
chrome
chrome.manifest
components
crashreporter

...

На відміну від цього ls -C(або -l) виводиться у формі стовпців незалежно від типу пристрою stdout. ls -C | lessсхоже на верхній вихід (але less, звичайно, підказок).

-F

Основна видима різниця між lsі lпов'язана з-F прапором, який викликає lsдодавання символьних суфіксів (званих індикаторів) до записів, які він відображає. Ці показники ідентифікують, що це за файл чи каталог.

Порівняйте це з результатами першої lsкоманди вище:

ek@Kip:~/firefox$ ls -F
application.ini             libfreebl3.chk     libxpcom.so*
blocklist.xml               libfreebl3.so*     libxul.so*
chrome/                     libmozalloc.so*    mozilla-xremote-client*
chrome.manifest             libmozsqlite3.so*  omni.ja
components/                 libnspr4.so*       platform.ini
crashreporter*              libnss3.so*        plugin-container*

...

Тут:

  • / означає запис - каталог.
  • * означає, що запис - це звичайний файл і виконується (тобто має виконуваний файл) права ).
  • Відсутність будь-якого індикатора означає, що запис - це звичайний файл, який не виконується.

Є кілька інших показників:

--classifyПрапор та --indicator-style=classifyеквівалентні -F.

Джерело: Посібник GNU Coreutils , Розділ 10.1.5 Загальне форматування вихідних даних

На закінчення, l( ls -CF) подібний, але не такий, якls .

Також добре пам’ятати:

Один і той же текст може бути як звичайною командою, так і псевдонімом.

Зазвичай це використовується для визначення параметрів, які широко вважаються як дуже корисними, так і нешкідливими, наприклад, автоматичне забарвлення (коли колір застосовується, коли stdout не перенаправлений або є терміналом, тому коди евакуації, що вказують кольори, практично гарантуються, що їх неправильно трактують).

За цим принципом lsсама по собі є псевдонімом.

ek@Kip:/$ alias ls
alias ls='ls --color=auto'

То яка команда насправді виконується при запуску l? Цей:

/bin/ls --color=auto -CF
  1. Оболонка ( bash) розв'язує команди, які не містять /першого, що з’являється в матчі PATH, що в Ubuntu for lsє /bin/ls.
  2. Псевдоніми можуть містити псевдоніми. Дозвіл псевдоніму не є рекурсивним (псевдонім не може викликати себе, хоча він може викликати звичайну команду, яка має те саме ім'я). Але це дійсно підтримує гніздування .

Так lвирішує, до ls -CFякого вирішується ls --color=auto -CF.

Псевдоніми можна змінити.

Ці псевдоніми існують, оскільки вони налаштовані таким чином за замовчуванням, але кожен користувач може змінити свої псевдоніми. Дивіться man alias, Розділ 25 та Додаток M у Посібнику з розширеного сценарію Bash та як зберегти мої записи "псевдоніму" назавжди .

Пов'язане: Що означають різні кольори у л?


6

Насправді обидва lsі lрівні

raja@badfox:~/Pictures$ l
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png
raja@badfox:~/Pictures$ ls
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png

чому означає, що для цього є вбудований псевдонім системи. якщо ви хочете побачити, відкрийте свій термінал і введіть, aliasтоді ви отримаєте такий вихід

raja@badfox:~/Pictures$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias lock='gnome-screensaver-command -l'
alias ls='ls --color=auto'
alias sms='php .sms.php'
raja@badfox:~/Pictures$ 

Таємниця розв’язана :)
— Арман

6
@Alison lі рівнини lsє НЕ те ж саме - вони просто сталося , щоб зробити той же результат для цих конкретних файлів, так як не було жодного каталоги, виконувані, символічні посилання, або вузли пристрою (і стандартний висновок був термінал).
— Елія Каган

Ви можете бачити, alias l='ls -CF'так що це не те саме. Крім того, якщо ви хочете отримати більш короткий вихід, ви можете запустити alias l.
— wjandrea

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.