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.
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.
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.
dir --color;)