A relação entre ls
e dir
ls
e dir
são programas separados que se comportam de maneira semelhante. Conforme explicado e mencionado abaixo, o propósito de dir
é fornecer um comando como ls
cuja saída não varia dependendo se ele está indo ou não para um terminal . Para conseguir isso de maneira útil, dir
deve formatar sua saída de uma maneira que seja razoável e útil tanto para exibição em um terminal quanto para gravação em um arquivo ou pipe.
Existem dois equívocos comuns sobre dir
:
- Muitas pessoas acreditam que
dir
é um alias de ls
, mas esse não é o caso. Nenhum comando é um alias do outro e, por padrão, no Ubuntu, dir
não é um alias. ls
e dir
são fornecidos por executáveis separados e não idênticos.
- Muitas pessoas acreditam que
dir
existe por razões históricas obscuras ou para fornecer compatibilidade com algum padrão ou outro sistema operacional. Esse não é o caso também. ls
se comporta da mesma forma que na compatibilidade. dir
, que não precisa ser compatível porque não é um comando padrão do Unix, comporta-se de uma maneira alternativa que os desenvolvedores consideram valiosa em seu direito próprio e, possivelmente, até mesmo preferível.
OK, mas exatamente como ls
e dir
diferem?
Tanto ls
como dir
listam o conteúdo dos diretórios. Duas diferenças específicas em seus comportamentos padrão os distinguem.
-
Quando a saída padrão é um terminal, ls
lista nomes de arquivos em colunas classificadas verticalmente (como ls -C
). Quando a saída padrão não é um terminal (por exemplo, um arquivo ou um canal ), ls
listas nomes de arquivo um por linha (como ls -1
).
Independentemente de sua saída padrão ser um terminal, dir
lista nomes de arquivos em colunas classificadas verticalmente (como ls -C
).
Para os ls
e dir
, esses padrões podem ser substituídos pelo sinalizador --format=
e pelos sinalizadores -1
, -C
, -m
e -x
, que abreviam% co_de particular % opções. Veja 10.1.4 formatação geral de saída no GNU coreutils manual de referência para detalhes.
-
Quando a saída padrão é um terminal e um nome de arquivo a ser listado contém caracteres de controle , --format=
imprime ls
em vez de cada caractere de controle (como ?
). Quando sua saída padrão não é um terminal, ls -q
imprime caracteres de controle como estão (como ls
).
Independentemente de sua saída padrão ser um terminal, quando ls --show-control-chars
encontra um caractere de controle ou qualquer outro caractere que seria interpretado especialmente se inserido em um shell, ele imprime sequências de barra invertida para os caracteres. Isso inclui até mesmo caracteres relativamente comuns, como espaços. Por exemplo, dir
listará uma entrada chamada dir
as Documents backups
. Isso é como Documents\ backups
.
Para ambos, ls -b
e ls
, esses padrões podem ser substituídos pelos sinalizadores listados em 10.1.7 Formatando os nomes dos arquivos no manual de referência GNU coreutils . Isso inclui dir
, -b
, -q
e alguns outros.
Fontes : Invocação de ls e invocação dir , no manual de referência GNU coreutils .
Por que --quoting-style=
?
A justificativa para um utilitário dir
separado é dada em 4.5 Padrões para interfaces em geral a> dos padrões de codificação GNU . Eu recomendo ler toda essa seção para entender o raciocínio dos desenvolvedores, mas aqui estão os destaques aplicáveis a dir
/ ls
:
Por favor, não faça o comportamento de um utilitário depender do nome usado para
invocá-lo ....
Em vez disso, use uma opção de tempo de execução ou uma opção de compilação ou ambos para
selecione entre os comportamentos alternativos ....
Da mesma forma, não faça o comportamento de um programa de linha de comando
depende do tipo de dispositivo de saída ....
A compatibilidade requer que certos programas dependam do tipo de
dispositivo de saída. Seria desastroso se dir
ou ls
não o fizesse
a maneira como todos os usuários esperam.Em alguns desses casos, nós suplementamos
programa com uma versão alternativa preferida que não depende da
tipo de dispositivo de saída. Por exemplo, nós fornecemos um programa sh
como
dir
exceto que seu formato de saída padrão é sempre multi-coluna
formato.
O Projeto GNU considera indesejável, do ponto de vista técnico, um utilitário produzir saídas diferentes dependendo do tipo de dispositivo para o qual ele está gravando (pelo menos na configuração padrão do utilitário). Para alguns utilitários, incluindo ls
, a saída dependente de dispositivo é necessária para compatibilidade e, portanto, funciona da maneira esperada pelos usuários. Alguns usuários também preferem especificamente esse comportamento dependente de dispositivo.
Embora ls
não pudesse ser razoavelmente escrito para se comportar de forma independente, foi criado um utilitário ls
separado para conseguir isso. Assim, dir
não é o utilitário que se comporta estranhamente por razões de compatibilidade histórica - dir
is .
Para ver como ls
, ls
e o utilitário dir
relacionado são implementados no código-fonte coreutils sem duplicação de código desnecessária, consulte vdir
, ls-dir.c
, ls-ls.c
, ls-vdir.c
e ls.h
.
O ls.c
é realmente útil?
Se você desejou que dir
produzisse saída em várias colunas mesmo quando você canalizou o co_de% ( ls
) para% ou redirecionou para um arquivo ( less
), você pode usar ls | less
ou ls > out.txt
.
Se você já desejou poder copiar diretamente um nome de arquivo mostrado por dir
e usá-lo como parte de um comando sem se preocupar em citar , use ls -C
ou ls
.
dir
é equivalente a ls -b
, portanto, nesse sentido, você não precisa de dir
. Mas ls -Cb
fornece uma combinação de opções que, na prática, é frequentemente útil (embora não seja amplamente conhecida).
Por que recebo saída colorida de dir
(mesmo dir
), mas não ls
?!
A maioria dos usuários do Ubuntu tem um alias chamado ls -Cb
, que executa dir
. Quando ls
existe como um alias e um comando externo, o alias tem precedência em comandos simples e interativos.
As definições de alias não são expandidas recursivamente - é o comando ls --color=auto
externo que o alias ls
chama com ls
. Veja 6.6 Aliases no Manual de referência do bash para mais informações sobre como os aliases funcionam.
Quando passado para ls
, --color=auto
ou ls
(e alguns outros comandos, como dir
), vdir
usa cores quando sua saída é um terminal, mas não o contrário.
Por padrão no Ubuntu, as contas de usuário são criadas com isso em grep
:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
Você perceberá que o --color=auto
alias ( ~/.bashrc
) não está comentado, enquanto os de ls
e alias ls='ls --color=auto'
são comentados com dir
, portanto, eles não surtem efeito. Ou seja, enquanto vdir
não é um alias, #
é (mas não para dir
) .
Como faço com que ls
produza saída colorida também?
Para ativar a saída colorida com dir
, basta editar dir
em seu diretório pessoal e descomentar a linha dir
, removendo a entrelinha .bashrc
. Nos shells iniciados após a alteração, #alias dir='dir --color=auto'
será um alias.
Se você quiser a mudança no shell atual, você pode executar a definição de alias como um comando, ou você pode obter #
executando dir
.
Isso indiscutivelmente vai contra o ponto principal de .bashrc
- que deve produzir o mesmo tipo de saída, independentemente do dispositivo de saída. No entanto:
- Se você achar útil criar este
. ~/.bashrc
alias, certamente deverá fazê-lo.
- Quando chamado como um comando externo, por exemplo, em scripts ou se você substituir o alias executando
dir
ou dir
, \dir
ainda produzirá saída independente de dispositivo. Isso quer dizer que o aliasing command dir
to dir
realmente não quebra o dir
.