l
é um alias para ls -CF
, que se comporta de maneira diferente da simples ls
.
-C
-C
faz ls
imprimir saída em forma de coluna. Quando o stdout é um terminal (em vez de ser redirecionado para um arquivo ou dispositivo não terminal, ou canalizado para outro comando), -C
está implícito. Portanto, executar ls -C
é o mesmo que executar ls
. Mas eles não são equivalentes quando ls
é redirecionado ou canalizado. Por exemplo:
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
...
Por outro lado, ls -C
(ou -l
) é gerado na forma de coluna, independentemente do tipo de dispositivo stdout
. ls -C | less
parece com a saída principal (mas paginada por less
, claro).
-F
A principal diferença visível entre ls
e l
é devido à -F
flag, que faz com que ls
anexe sufixos simbólicos (chamados de indicadores) às entradas exibidas. Esses indicadores identificam que tipo de arquivo ou diretório eles são.
Compare isso com a saída do primeiro comando ls
acima:
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*
...
Aqui:
-
/
significa que a entrada é um diretório. -
*
significa que a entrada é um arquivo normal e é executável (ou seja, tem permissões executáveis). - A ausência de qualquer indicador significa que a entrada é um arquivo normal que não é executável.
Existem vários outros indicadores:
-
@
significa que a entrada é um link simbólico (veja tambémman symlink
). -
|
significa que a entrada é um dispositivo FIFO (lembre-se, muitos recursos em SOs semelhantes a Unix são representados por entradas do sistema de arquivos ). -
=
significa que a entrada é um soquete . -
>
significa que a entrada é uma porta .
O --classify
flag e --indicator-style=classify
são equivalentes a -F
.
Fonte: manual do GNU Coreutils , Seção 10.1.5 Formatação geral de saída
Em conclusão, l
( ls -CF
) é semelhante mas não é o mesmo de ls
.
Também é bom ter em mente:
O mesmo texto pode ser um comando regular e um alias.
Isso é comumente usado para especificar opções amplamente consideradas altamente úteis e inofensivas, como colorização automática (onde a cor é aplicada quando stdout
não é redirecionado ou é um terminal, portanto os códigos de escape que especificam cores são virtualmente garantidos, não para ser mal interpretado).
Por esse princípio, ls
é um alias.
ek@Kip:/$ alias ls
alias ls='ls --color=auto'
Então, qual comando realmente é executado quando você executa l
? Este aqui:
/bin/ls --color=auto -CF
- O shell (
bash
) resolve comandos que não contém um/
para a primeira correspondência aparecendo emPATH
, que no Ubuntu porls
é/bin/ls
. - Os aliases podem conter aliases. A resolução de alias não é recursiva (um alias não pode se chamar, embora possa chamar um comando regular que tenha o mesmo nome). Mas suporta aninhamento .
Portanto, l
resolve para ls -CF
, que resolve para ls --color=auto -CF
.
Os aliases podem ser alterados.
Esses aliases existem porque são configurados dessa maneira por padrão, mas todos os usuários podem alterar seus aliases. Veja man alias
, Capítulo 25 e Anexo M no Advanced Bash-Scripting Guide, e Como salvar minhas entradas de "alias" para sempre .
Relacionado: O que as diferentes cores significa em sl?