Diferença entre comandos de terminal 'dir' e 'ls'?

74

Eu tenho tentado encontrar a diferença entre usar os comandos dire lsno 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, direle 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 -ae dir -aambos retornam todos os arquivos e pastas e arquivos ocultos).

Então, alguém sabe qual é a diferença e por que ambos dire lssão usados?

BretD
fonte
7
dir --color;)
Rinzwind 13/02/2012
3
Só queria dizer que estou surpreso com a quantidade de resposta que esta pergunta recebeu. Eu acho que não era o único pensando sobre isso :)
BretD
3
Comandos de tempos antigos sempre arrastar os nerds mais velhos para fora da toca;)
Rinzwind

Respostas:

70

dire lsfazem parte coreutilse dirsão quase iguais ls, apenas com diferentes opções padrão.

Os GNU Core Utilities são os utilitários básicos de manipulação de arquivos, shell e texto do sistema operacional GNU. Esses são os principais utilitários que existem em todos os sistemas operacionais.

info dir diz:

diré equivalente a ls -C -b; ou seja, por padrão, os arquivos são listados em colunas, classificados verticalmente e os caracteres especiais são representados por seqüências de escape de barra invertida.

Ah, e também há vdir! info vdirdiz:

vdiré equivalente a ls -l -b; ou seja, por padrão, os arquivos são listados em formato longo e os caracteres especiais são representados por seqüências de escape de barra invertida.

Provavelmente direxiste para compatibilidade com versões anteriores ou devido a razões históricas.

Rinzwind
fonte
Eu estava pensando que provavelmente era apenas um pseudônimo do outro. Eu assumi que o raciocínio era fazer com que os usuários do Windows se sentissem mais em casa lol Obrigado pela resposta completa!
BretD 13/02/12
4
digite alias dirpara ver o que realmente é. digite aliaspara ver todos os aliases.
user606723
2
@ user606723, 'alias dir' não aparece na 11.10 (pelo menos não para mim). Acredito que 'alias' mostra apenas configurações de alias de usuário local, não todo o sistema.
James
digite type dirpara ver o que é (um alias, um comando, uma função de festa ...)
ychaouche
49

A relação entre lsedir

lse dirsão programas separados que se comportam de maneira semelhante. Conforme explicado e referenciado abaixo, o objetivo de diré fornecer um comando como lscuja saída não varia dependendo de se está indo ou não para um terminal . Para isso, é dirnecessá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, dirnão é um alias. lse dirsão fornecidos por executáveis ​​separados e não idênticos.
  • Muitas pessoas acreditam que direxiste 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. lscomporta-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 lse dirdiferem?

Ambos lse dirlistam o conteúdo dos diretórios. Duas diferenças específicas em seus comportamentos padrão os distinguem.

  1. Quando sua saída padrão é um terminal, lslista 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 ), lslista os nomes dos arquivos um por linha (como ls -1).

    Se sua saída padrão é ou não um terminal, dirlista os nomes de arquivos em colunas classificadas verticalmente (como ls -C).

    Para ambos lse dir, esses padrões podem ser substituídos pela --format=bandeira e pelo -1, -C, -m, e -xbandeiras, 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.

  2. Quando sua saída padrão é um terminal e um nome de arquivo a ser listado contém caracteres de controle , lsimprime em ?vez de cada caractere de controle (como ls -q). Quando sua saída padrão não é um terminal, lsimprime 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 direncontra 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, dirlistará uma entrada chamada Documents backupscomo Documents\ backups. Isto é como ls -b.

    Para ambos lse 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 dirutilitá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 lsou shnã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 dirprograma semelhante, lsexceto 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 lsnão fosse possível escrever razoavelmente para comportar o dispositivo de forma independente, um dirutilitário separado foi criado para isso. Portanto, dirnão é o utilitário que se comporta estranhamente por razões de compatibilidade histórica - lsé .

Para ver como ls, dir, e as respectivas vdirutilidade 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.

É dirrealmente útil?

Se você já desejou lsproduzir 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 dirou ls -C.

Se você já desejou poder copiar diretamente um nome de arquivo mostrado por lse usá-lo como parte de um comando sem se preocupar com a citação , use dirou ls -b.

diré equivalente a ls -Cb, então nesse sentido você não precisa dir. Mas dirfornece 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 lsque é executado ls --color=auto. Quando lsexiste 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 lscomando externo com o qual o lsalias 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, dirou vdir(e alguns outros comandos, como grep), --color=autousa 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 lsalias ( alias ls='ls --color=auto') não é comentado, enquanto aqueles para dire vdirsão comentados, #para que não surtam efeito. Ou seja, enquanto dirnão é um alias, lsé (mas não é dir) .

Como também dirproduzo impressões coloridas?

Para habilitar a saída colorida dir, basta editar .bashrcno diretório inicial e descomentar a #alias dir='dir --color=auto'linha removendo a guia #. Nos shells iniciados após a alteração, dirhaverá um alias.

Se você deseja alterar o shell atual, pode executar a definição de alias como um comando ou pode originar .bashrcexecutando . ~/.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 diralias, certamente deve fazê-lo.
  • Quando chamado como um comando externo, por exemplo, em scripts ou se você substituir o alias executando \dirou command dir, dirainda produzirá uma saída independente do dispositivo. Isso é para dizer que aliasing dirpara dir --color=autorealmente não quebrar dir.
Eliah Kagan
fonte
Resposta de qualidade, mas poderia usar um ToC ou TL; DR; :)
Kevin
5

Eu estaria inclinado a pensar que direxiste apenas para compatibilidade com versões anteriores .

Do GNU Coreutils :

dir é equivalente a ls -C -b; ou seja, por padrão, os arquivos são listados em colunas, classificados verticalmente e os caracteres especiais são representados por seqüências de escape de barra invertida.

A propósito, lsnão colorir a saída por padrão: isso ocorre porque a maioria das distros alias lspara ls --color=autoin /etc/profile.d. Para um teste, digite unalias lse tente ls: será incolor.

Fonte: Renan 's resposta para o que é a diferença entre ‘dir’ e ‘ls’ ?

Zlatan
fonte
Embora nãodir seja fornecida para compatibilidade com versões anteriores - e lsna 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.
Eliah Kagan 11/10
3

Em caso de dúvida, compare type lsvs type dir(consulte também Diferença entre ls e la ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

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.

user2394284
fonte
2
Isso não parece ser uma configuração de usuário padrão do Ubuntu. Eu não acho que nenhum dos sistemas Ubuntu que eu usei tenha lsum 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.
Eliah Kagan
2
@EliahKagan: Você adivinhou, estou usando o OpenSuse! Então, como eu disse, o resultado será diferente, mas o método deve estar correto.
precisa saber é o seguinte
2

Resposta curta: Nenhum, diré o mesmo código fonte do que ls, lsbinário tem --colorpor padrão. (1 linha de código diff)

Francisco Valdez
fonte
7
dirnão é um apelido de ls. Eles são binários separados no /usr/binque 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ários dire separados lsem todos os sistemas que usam o GNU Coreutils . Se você precisar de provas, corra cmp /bin/ls /bin/dir.
Eliah Kagan
2
Há algum tempo, era um alias e você podia vê-lo listado na lista de alias apenas digitando 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).
Francisco Valdez
1
Sim, diré ls, mas com diferentes opções padrão . dire lssempre houve binários separados em distribuições que usam o GNU Coreutils. Algumas distribuições podem, ou pode ter, também definido um alias chamado dir(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 esse diré um apelido lsno Ubuntu.
Eliah Kagan
Sim, eu concordo com você, mas, neste caso, não é um código-fonte semelhante, é o mesmo código-fonte. Se dissermos que um alias é apenas algo listado alias, é claro que não é um alias.
Francisco Valdez
3
Não é o mesmo código fonte. Como você disse, "uma linha de origem é alterada". E se fosse a mesma fonte, ainda não seria um alias. Existem muitas coisas em um sistema semelhante ao Unix semelhantes a aliases, mas que seriam muito confusas para iniciantes (e irritante para usuários experientes) para chamar aliases. Links simbólicos, links físicos, arquivos idênticos, arquivos semelhantes, scripts de wrapper, executáveis ​​ocultos no shell e arquivos sincronizados (por exemplo, com o UbuntuOne) são todos semelhantes aos alias de maneira significativa, mas não são alias.
Eliah Kagan