Diferença entre os comandos do terminal 'dir' e 'ls'?

61

Estou tentando encontrar a diferença entre usar os comandos dir e ls no terminal. Eu sei que ls é o método tradicional UNIX de visualizar os arquivos em um diretório, e que dir é o prompt de comando do Windows equivalente, 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 , ele fará o mesmo, exceto com destaque de conteúdo. Ambos os comandos aceitam opções (ou seja, ls -a e dir -a retornam todos os arquivos e pastas e arquivos ocultos.

Então alguém sabe qual é a diferença e por que ambos os dir e ls são usados?

    
por BretD 13.02.2012 / 19:15

5 respostas

55

dir e ls fazem parte de coreutils e dir é quase o mesmo que ls , apenas com diferentes opções padrão.

  

O 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 devem existir em todos os sistemas operacionais.

info dir diz:

  

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

Ah e também há vdir ! info vdir diz:

  

vdir é equivalente a ls -l -b ; isto é, por padrão, os arquivos são   listado em formato longo e caracteres especiais são representados por   sequências de escape de barra invertida.

O mais provável dir existe para compatibilidade com versões anteriores ou devido a razões históricas.

    
por Rinzwind 13.02.2012 / 19:33
37

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.

  1. 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.

  2. 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 .
por Eliah Kagan 29.04.2015 / 18:15
4
  

Eu estaria inclinado a pensar que dir está lá apenas por trás   compatibilidade .

     

De GNU Coreutils :

     
    

dir equivale 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 sequências de escape de barra invertida.

  
     

A propósito, ls não colore a saída por padrão: isso é   porque a maioria das distros alias ls to ls --color=auto in   %código%. Para um teste, digite /etc/profile.d e tente unalias ls : ele será   seja incolor.

Fonte: Renan 's answer para Qual é a diferença entre "Dir" e "ls" ?

    
por Zlatan 14.09.2013 / 18:40
2

Resposta curta: nenhuma, dir é um alias de ls , como @Rinzwind disse, ls tem --color por padrão

    
por Francisco Valdez 13.02.2012 / 19:26
2

Em caso de dúvida, compare type ls vs type dir (veja 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 seria o mais visível, seu sistema pode ser diferente.

    
por user2394284 22.12.2016 / 22:45