A relação entre ls
edir
ls
e dir
são programas separados que se comportam de maneira semelhante. Conforme explicado e referenciado abaixo, o objetivo de dir
é fornecer um comando como ls
cuja saída não varia dependendo de se está indo ou não para um terminal . Para isso, é dir
necessário formatar sua saída de maneira razoável e útil, tanto para visualização em um terminal quanto para gravação em um arquivo ou canal.
Existem dois equívocos comuns sobre dir
:
- Muitas pessoas acreditam que
dir
é um pseudônimo de ls
, mas esse não é o caso. Nenhum dos comandos é 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 sistema operacional padrão ou outro. Esse também não é o caso. ls
comporta-se da maneira que faz para compatibilidade. dir
, que não precisa ser compatível porque não é um comando padrão do Unix, se comporta de uma maneira alternativa que os desenvolvedores consideram valiosa por si só e possivelmente até preferível.
OK, mas exatamente como ls
e dir
diferem?
Ambos ls
e dir
listam o conteúdo dos diretórios. Duas diferenças específicas em seus comportamentos padrão os distinguem.
Quando sua saída padrão é um terminal, ls
lista os nomes de arquivos em colunas classificadas verticalmente (como ls -C
). Quando sua saída padrão não é um terminal (por exemplo, um arquivo ou canal ), ls
lista os nomes dos arquivos um por linha (como ls -1
).
Se sua saída padrão é ou não um terminal, dir
lista os nomes de arquivos em colunas classificadas verticalmente (como ls -C
).
Para ambos ls
e dir
, esses padrões podem ser substituídos pela --format=
bandeira e pelo -1
, -C
, -m
, e -x
bandeiras, que abreviar particulares --format=
opções. Veja 10.1.4 Formatação geral de saída no manual de referência do GNU coreutils para obter detalhes.
Quando sua saída padrão é um terminal e um nome de arquivo a ser listado contém caracteres de controle , ls
imprime em ?
vez de cada caractere de controle (como ls -q
). Quando sua saída padrão não é um terminal, ls
imprime os caracteres de controle como estão (como ls --show-control-chars
).
Quer sua saída padrão seja ou não um terminal, quando dir
encontra um caractere de controle ou qualquer outro caractere que seria interpretado especialmente se inserido em um shell, ele imprime seqüências de barra invertida para os caracteres. Isso inclui até caracteres relativamente comuns, como espaços. Por exemplo, dir
listará uma entrada chamada Documents backups
como Documents\ backups
. Isto é como ls -b
.
Para ambos ls
e dir
, esses padrões podem ser substituídos pelos sinalizadores listados em 10.1.7. Formatando os nomes de arquivo no manual de referência do GNU coreutils . Isto inclui -b
, -q
, --quoting-style=
, e alguns outros.
Fontes : ls invocation e dir invocation , no manual de referência GNU coreutils .
Por que ter dir
?
A justificativa para um dir
utilitário separado é dada em 4.5 Standards for Interfaces Geralmente dos padrões de codificação GNU . Eu recomendo a leitura dessa seção inteira para entender o raciocínio dos desenvolvedores, mas aqui estão os destaques aplicáveis a ls
/ dir
:
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 ambas para selecionar entre os comportamentos alternativos ....
Da mesma forma, não faça o comportamento de um programa de linha de comando depender do tipo de dispositivo de saída ....
A compatibilidade exige que certos programas dependam do tipo de dispositivo de saída. Seria desastroso se o fizesse ls
ou sh
não da maneira que todos os usuários esperam. Em alguns desses casos, complementamos o programa com uma versão alternativa preferida que não depende do tipo de dispositivo de saída. Por exemplo, fornecemos um dir
programa semelhante,
ls
exceto que o formato de saída padrão é sempre o formato de várias colunas.
O Projeto GNU considera indesejável, de uma perspectiva técnica, que um utilitário produza uma saída diferente, dependendo do tipo de dispositivo para o qual está gravando (pelo menos na configuração padrão do utilitário). Para alguns utilitários, inclusive ls
, a saída dependente do dispositivo é necessária para compatibilidade e, portanto, funciona da maneira que os usuários esperam. Alguns usuários também preferem especificamente esse comportamento dependente do dispositivo.
Embora ls
não fosse possível escrever razoavelmente para comportar o dispositivo de forma independente, um dir
utilitário separado foi criado para isso. Portanto, dir
não é o utilitário que se comporta estranhamente por razões de compatibilidade histórica - ls
é .
Para ver como ls
, dir
, e as respectivas vdir
utilidade são implementadas no código fonte coreutils sem duplicação de código desnecessário, veja ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
, e ls.c
.
É dir
realmente útil?
Se você já desejou ls
produzir uma saída com várias colunas, mesmo quando a direcionou para less
( ls | less
) ou a redirecionou para um arquivo ( ls > out.txt
), você pode usar dir
ou ls -C
.
Se você já desejou poder copiar diretamente um nome de arquivo mostrado por ls
e usá-lo como parte de um comando sem se preocupar com a citação , use dir
ou ls -b
.
dir
é equivalente a ls -Cb
, então nesse sentido você não precisa dir
. Mas dir
fornece uma combinação de opções que, na prática, geralmente são úteis (embora não sejam amplamente conhecidas).
Por que obtenho uma saída colorida de ls
(par ls -Cb
), mas não dir
?!
A maioria dos usuários do Ubuntu tem um apelido chamado ls
que é executado ls --color=auto
. 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 ls
comando externo com o qual o ls
alias está chamando --color=auto
. Consulte 6.6 Aliases no manual de referência do Bash para obter mais informações sobre como funcionam os aliases.
Quando transmitida para ls
, dir
ou vdir
(e alguns outros comandos, como grep
), --color=auto
usa a cor quando a sua saída é um terminal, mas não de outro modo.
Por padrão no Ubuntu, contas de usuário são criadas com isso em ~/.bashrc
:
# 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ê notará que o ls
alias ( alias ls='ls --color=auto'
) não é comentado, enquanto aqueles para dir
e vdir
são comentados, #
para que não surtam efeito. Ou seja, enquanto dir
não é um alias, ls
é (mas não é dir
) .
Como também dir
produzo impressões coloridas?
Para habilitar a saída colorida dir
, basta editar .bashrc
no diretório inicial e descomentar a #alias dir='dir --color=auto'
linha removendo a guia #
. Nos shells iniciados após a alteração, dir
haverá um alias.
Se você deseja alterar o shell atual, pode executar a definição de alias como um comando ou pode originar .bashrc
executando . ~/.bashrc
.
Isso sem dúvida vai contra o ponto principal de dir
- que deve produzir o mesmo tipo de saída, independentemente do dispositivo de saída. Contudo:
- Se você achar útil criar esse
dir
alias, certamente deve fazê-lo.
- Quando chamado como um comando externo, por exemplo, em scripts ou se você substituir o alias executando
\dir
ou command dir
, dir
ainda produzirá uma saída independente do dispositivo. Isso é para dizer que aliasing dir
para dir --color=auto
realmente não quebrar dir
.
dir --color
;)