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?