На l
моей машине есть команда, которая ничего не делает. which l
также не производит вывод. Это настоящая команда, и действительно ли она что-то делает?
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*
...
Вот:
/
означает, что запись является каталогом.*
означает, что запись является обычным файлом и является исполняемой (то есть имеет права на выполнение ).Есть несколько других показателей:
@
означает, что запись является символической ссылкой (см. также man symlink
).|
означает, что запись является устройством FIFO (помните, что многие ресурсы в Unix-подобных ОС представлены записями файловой системы ).=
означает, что запись является сокетом .>
означает, что вход - это дверь .--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
bash
) разрешает команды, которые не содержат /
до первого совпадения PATH
, которое есть в Ubuntu для ls
is /bin/ls
.Так l
решает, к ls -CF
чему разрешает ls --color=auto -CF
.
Эти псевдонимы существуют, потому что они настроены таким образом по умолчанию, но каждый пользователь может изменить свои псевдонимы. См man alias
, глава 25 и Приложение M в Расширенном руководстве Bash-Scripting, и как сохранить мои «Alias» записи навсегда .
Связанный: Что означают разные цвета в ls?
На самом деле оба 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$
l
и равниныls
являются не то же самое - они просто произошло , чтобы произвести тот же результат для этих конкретных файлов, так как не было ни одного каталоги, исполняемые, символические ссылки, или узлы устройства (и стандартный вывод был терминал).alias l='ls -CF'
так что это не то же самое. Кроме того, если вы хотите получить более краткий вывод, вы можете запуститьalias l
.В случае сомнений
type l
:(см. также, что делает команда la )
источник