Eu tenho tentado encontrar a diferença entre usar os comandos dir
e ls
no terminal. Eu sei que ls é o método UNIX tradicional de exibir os arquivos em um diretório, e esse dir
é o equivalente do prompt de comandos do Windows, mas ambos os comandos funcionam no terminal.
Se eu digitar, dir
ele exibirá os arquivos e pastas no diretório e, se eu digitar ls
, fará o mesmo, exceto com o destaque do conteúdo. Ambos os comandos aceitam opções (ou seja, ls -a
e dir -a
ambos retornam todos os arquivos e pastas e arquivos ocultos).
Então, alguém sabe qual é a diferença e por que ambos dir
e ls
são usados?
command-line
directory
ls
coreutils
BretD
fonte
fonte
dir --color
;)Respostas:
dir
els
fazem partecoreutils
edir
são quase iguaisls
, apenas com diferentes opções padrão.info dir
diz:Ah, e também há
vdir
!info vdir
diz:Provavelmente
dir
existe para compatibilidade com versões anteriores ou devido a razões históricas.fonte
alias dir
para ver o que realmente é. digitealias
para ver todos os aliases.type dir
para ver o que é (um alias, um comando, uma função de festa ...)A relação entre
ls
edir
ls
edir
são programas separados que se comportam de maneira semelhante. Conforme explicado e referenciado abaixo, o objetivo dedir
é fornecer um comando comols
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
:dir
é um pseudônimo dels
, 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
edir
são fornecidos por executáveis separados e não idênticos.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
edir
diferem?Ambos
ls
edir
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 (comols -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 (comols -1
).Se sua saída padrão é ou não um terminal,
dir
lista os nomes de arquivos em colunas classificadas verticalmente (comols -C
).Para ambos
ls
edir
, 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 (comols -q
). Quando sua saída padrão não é um terminal,ls
imprime os caracteres de controle como estão (comols --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 chamadaDocuments backups
comoDocuments\ backups
. Isto é comols -b
.Para ambos
ls
edir
, 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 als
/dir
: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, umdir
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 respectivasvdir
utilidade são implementadas no código fonte coreutils sem duplicação de código desnecessário, vejals-dir.c
,ls-ls.c
,ls-vdir.c
,ls.h
, els.c
.É
dir
realmente útil?Se você já desejou
ls
produzir uma saída com várias colunas, mesmo quando a direcionou paraless
(ls | less
) ou a redirecionou para um arquivo (ls > out.txt
), você pode usardir
ouls -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 , usedir
ouls -b
.dir
é equivalente als -Cb
, então nesse sentido você não precisadir
. Masdir
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
(parls -Cb
), mas nãodir
?!A maioria dos usuários do Ubuntu tem um apelido chamado
ls
que é executadols --color=auto
. Quandols
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 ols
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
ouvdir
(e alguns outros comandos, comogrep
),--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
:Você notará que o
ls
alias (alias ls='ls --color=auto'
) não é comentado, enquanto aqueles paradir
evdir
são comentados,#
para que não surtam efeito. Ou seja, enquantodir
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:dir
alias, certamente deve fazê-lo.\dir
oucommand dir
,dir
ainda produzirá uma saída independente do dispositivo. Isso é para dizer que aliasingdir
paradir --color=auto
realmente não quebrardir
.fonte
Fonte: Renan 's resposta para o que é a diferença entre ‘dir’ e ‘ls’ ?
fonte
dir
seja fornecida para compatibilidade com versões anteriores - els
na verdade é -, esta resposta (e a resposta citada) indica corretamente a diferença técnica entre os dois comandos, além de explicar a diferença de coloração comumente observada. Então, +1.Em caso de dúvida, compare
type ls
vstype dir
(consulte também Diferença entre ls e la ):A diferença se resume a diferentes opções para
ls
, no meu caso--color=tty
, ser a mais visível, seu sistema pode ser diferente.fonte
ls
um alias para uma função chamada_ls
- nem mesmo como uma linha comentada.bashrc
. Parece o padrão para (pelo menos algumas versões do) openSuSE, a julgar por essa conversa , esse arquivo (vinculado a partir daí) e minha memória (reconhecidamente talvez errada) de quando eu usei o openSUSE pela última vez.Resposta curta: Nenhum,
dir
é o mesmo código fonte do quels
,ls
binário tem--color
por padrão. (1 linha de código diff)fonte
dir
não é um apelido dels
. Eles são binários separados no/usr/bin
que se comportam de forma diferente, conforme descrito na Rinzwind 's resposta . Você pode conseguir isso com aliases, mas não é assim que é alcançado. Aparecem bináriosdir
e separadosls
em todos os sistemas que usam o GNU Coreutils . Se você precisar de provas, corracmp /bin/ls /bin/dir
.alias
, agora um novo binário é compilado para dir. Você pode baixar o código com:git clone git://git.sv.gnu.org/coreutils
. Apenas uma linha de código é alterado no ls-dir.c e é este:int ls_mode = LS_MULTI_COL;
. Tecnicamente, não é um alias, mas praticamente é LS, mas com diferentes opções padrão (1 linha de código).dir
éls
, mas com diferentes opções padrão .dir
els
sempre houve binários separados em distribuições que usam o GNU Coreutils. Algumas distribuições podem, ou pode ter, também definido um alias chamadodir
(definir aliases que são o mesmo nome de um comando existente é bastante comum). Mas eles são executáveis separados. Distinguir entre um apelido de shell (que não é um arquivo) e um executável separado com código-fonte semelhante, não é uma distinção pedante. É falso e enganoso dizer que essedir
é um apelidols
no Ubuntu.alias
, é claro que não é um alias.