Что делает команда l?

19

На lмоей машине есть команда, которая ничего не делает. which lтакже не производит вывод. Это настоящая команда, и действительно ли она что-то делает?

Armand
источник

Ответы:

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 для lsis /bin/ls.
  2. Псевдонимы могут содержать псевдонимы. Разрешение псевдонима не является рекурсивным (псевдоним не может вызывать сам себя, хотя он может вызывать обычную команду с тем же именем). Но это поддерживает вложение .

Так lрешает, к ls -CFчему разрешает ls --color=auto -CF.

Псевдонимы могут быть изменены.

Эти псевдонимы существуют, потому что они настроены таким образом по умолчанию, но каждый пользователь может изменить свои псевдонимы. См man alias, глава 25 и Приложение M в Расширенном руководстве Bash-Scripting, и как сохранить мои «Alias» записи навсегда .

Связанный: Что означают разные цвета в ls?

Элия ​​Каган
источник
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$ 
rɑːdʒɑ
источник
Тайна разгадана :)
Арманд
6
@Alison lи равнины lsявляются не то же самое - они просто произошло , чтобы произвести тот же результат для этих конкретных файлов, так как не было ни одного каталоги, исполняемые, символические ссылки, или узлы устройства (и стандартный вывод был терминал).
Элия ​​Каган
Вы можете видеть, alias l='ls -CF'так что это не то же самое. Кроме того, если вы хотите получить более краткий вывод, вы можете запустить alias l.
17