Що робить команда 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.