Differenza tra i comandi del terminale 'dir' e 'ls'?

62

Ho cercato di trovare la differenza tra l'utilizzo dei comandi dir e ls nel terminale. So che ls è il metodo UNIX tradizionale di visualizzare i file in una directory e che dir è l'equivalente del prompt dei comandi di Windows, ma entrambi i comandi funzionano nel terminale.

Se scrivo dir mostra i file e le cartelle nella directory e se digito ls fa lo stesso, tranne che per l'evidenziazione del contenuto. Entrambi i comandi accettano le opzioni (ad esempio ls -a e dir -a restituiscono entrambi file e cartelle e file nascosti.

Quindi qualcuno sa qual è la differenza e perché vengono utilizzati sia dir che ls ?

    
posta BretD 13.02.2012 - 19:15

5 risposte

57

dir e ls fanno parte di coreutils e dir è quasi la stessa di ls , solo con diverse opzioni predefinite.

  

Le GNU Core Utilities sono le utilità di base per la manipolazione di file, shell e testo del sistema operativo GNU. Queste sono le principali utilità che dovrebbero esistere su ogni sistema operativo.

info dir dice:

  

dir è equivalente a ls -C -b ; cioè, per impostazione predefinita sono elencati i file   in colonne, ordinate verticalmente e vengono rappresentati caratteri speciali   da backslash escape sequences.

Oh e c'è anche vdir ! info vdir dice:

  

vdir è equivalente a ls -l -b ; cioè, per default sono i file   elencati in formato lungo e caratteri speciali sono rappresentati da   sequenze di escape backslash.

Molto probabilmente dir esiste per compatibilità con le versioni precedenti o per ragioni storiche.

    
risposta data Rinzwind 13.02.2012 - 19:33
37

La relazione tra ls e dir

ls e dir sono programmi separati che si comportano allo stesso modo. Come spiegato e di seguito indicato, lo scopo di dir è di fornire un comando come ls il cui output non varia a seconda che stia andando o meno a un terminale . Per ottenere questo risultato utile, dir deve formattare l'output in modo ragionevole e utile sia per la visualizzazione in un terminale che per la scrittura su un file o una pipe.

Esistono due malintesi comuni su dir :

  • Molte persone credono che dir sia un alias di ls , ma non è così. Nessuno dei due comandi è un alias dell'altro, e per impostazione predefinita in Ubuntu, dir non è affatto un alias. ls e dir sono forniti da eseguibili separati, non identici.
  • Molte persone credono che dir esista per oscuri motivi storici o per fornire compatibilità con alcuni standard o altri sistemi operativi. Neanche questo è il caso. ls si comporta come fa per compatibilty. dir , che non deve essere compatibile perché non è un comando Unix standard, si comporta in un modo alternativo che gli sviluppatori considerano prezioso nel suo proprio ed eventualmente anche preferibile.

OK, ma esattamente in che modo ls e dir differiscono?

Sia ls che dir elencano il contenuto delle directory. Due differenze specifiche nei loro comportamenti predefiniti li distinguono.

  1. Quando il suo output standard è un terminale, ls elenca i nomi di file in colonne ordinate verticalmente (come ls -C ). Quando il suo output standard non è un terminale (ad esempio, un file o pipe ), ls elenca nomi di file uno per riga (come ls -1 ).

    Indipendentemente dal fatto che il suo output standard sia un terminale, dir elenca i nomi dei file nelle colonne ordinate verticalmente (come ls -C ).

    Sia per ls che dir , questi valori di default possono essere sostituiti dal flag --format= e dai valori -1 , -C , -m e -x , che abbreviano in particolare --format= opzioni. Vedi 10.1.4 Formattazione generale dell'output nel manuale di riferimento coreNG di GNU per i dettagli.

  2. Quando il suo output standard è un terminale e un nome file da elencare contiene caratteri di controllo , ls stampa ? invece di ogni carattere di controllo (come ls -q ). Quando il suo output standard non è un terminale, ls stampa i caratteri di controllo così com'è (come ls --show-control-chars ).

    Indipendentemente dal fatto che il suo output standard sia un terminale, quando dir incontra un carattere di controllo o qualsiasi altro carattere che sarebbe interpretato appositamente se inserito in una shell, stampa sequenze di backslash per i caratteri. Questo include anche personaggi relativamente comuni come spazi. Ad esempio, dir elencherà una voce denominata Documents backups come Documents\ backups . È come ls -b .

    Per entrambi ls e dir , questi valori di default possono essere sovrascritti dai flag elencati in 10.1.7 Formattazione dei nomi dei file nel manuale di riferimento GNU coreutils . Questo include -b , -q , --quoting-style= e altri.

Fonti : invocazione ls e invocazione dir , in manuale di riferimento GNU coreutils .

Perché dir ?

La logica di un'utilità dir separata è fornita in 4.5 Standard per le interfacce in generale degli standard di codifica GNU . Consiglio di leggere l'intera sezione per comprendere il ragionamento degli sviluppatori, ma qui ci sono i punti salienti applicabili a ls / dir :

  

Non fare in modo che il comportamento di un'utilità dipenda dal nome utilizzato   invocalo ....

     

Utilizzare invece un'opzione di runtime o uno switch di compilazione o entrambi   seleziona tra i comportamenti alternativi ....

     

Allo stesso modo, per favore non rendi il comportamento di un programma da riga di comando   dipende dal tipo di dispositivo di output ....

     

La compatibilità richiede che determinati programmi dipendano dal tipo di   Dispositivo di uscita. Sarebbe disastroso se ls o sh non lo facessero   il modo in cui tutti gli utenti si aspettano.In alcuni di questi casi, integriamo il   programma con una versione alternativa preferita che non dipende da   tipo di dispositivo di output. Ad esempio, forniamo un programma dir molto simile    ls tranne per il fatto che il formato di output predefinito è sempre multi-colonna   formato.

Il Progetto GNU considera indesiderabile, dal punto di vista tecnico, che un'utilità produca output diversi a seconda del tipo di dispositivo su cui sta scrivendo (almeno nella configurazione predefinita dell'utilità). Per alcune utilità, tra cui ls , l'output dipendente dal dispositivo è necessario per la compatibilità e quindi funziona come gli utenti si aspettano. Alcuni utenti preferiscono anche in modo specifico questo comportamento dipendente dal dispositivo.

Sebbene ls non possa essere ragionevolmente scritto per comportarsi in modo indipendente dal dispositivo, per raggiungere questo obiettivo è stata creata un'utilità dir separata. Pertanto dir non è l'utilità che si comporta in modo strano per motivi di compatibilità storica: ls è .

Per vedere come ls , dir e la relativa utility vdir sono implementate nel codice sorgente di coreutils senza la duplicazione del codice inutile, vedi ls-dir.c , ls-ls.c , ls-vdir.c , ls.h e ls.c .

Is dir è davvero utile?

Se hai mai desiderato ls ha prodotto l'output a più colonne anche quando lo hai reimpostato su less ( ls | less ) o reindirizzato a un file ( ls > out.txt ), puoi utilizzare dir o ls -C .

Se hai sempre desiderato poter copiare direttamente un nome file visualizzato da ls e utilizzarlo come parte di un comando senza preoccuparti di quotare , puoi utilizzare dir o ls -b .

dir equivale a ls -Cb , quindi in questo senso non è necessario dir . Ma dir fornisce una combinazione di opzioni che in pratica è spesso utile (sebbene non ampiamente conosciuta).

Perché ottengo l'output colorato da ls (anche ls -Cb ) ma non dir ?!

La maggior parte degli utenti di Ubuntu ha un alias chiamato ls che esegue ls --color=auto . Quando ls esiste sia come alias sia come comando esterno, l'alias ha la precedenza in comandi semplici e interattivi.

Le definizioni alias non sono espanse in modo ricorsivo: è il comando ls esterno che l'alias ls chiama con --color=auto . Vedi 6.6 alias nel Manuale di riferimento di Bash per ulteriori informazioni su come funzionano gli alias.

Quando viene passato a ls , dir o vdir (e ad altri comandi, come grep ), --color=auto usa il colore quando il suo output è un terminale, ma non altrimenti.

Di default in Ubuntu, gli account utente vengono creati con questo in ~/.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

Noterai che l'alias ls ( alias ls='ls --color=auto' ) non è commentato, mentre quelli per dir e vdir sono commentati con # in modo che non abbiano alcun effetto. Cioè, mentre dir non è un alias, ls è (ma non a dir ) .

Come faccio a rendere dir anche a produrre un risultato a colori?

Per abilitare l'output colorato con dir , modifica semplicemente .bashrc nella tua home directory e decommenta la riga #alias dir='dir --color=auto' rimuovendo il # iniziale. Nelle shell avviate dopo la modifica, dir sarà un alias.

Se vuoi cambiare la shell corrente, puoi eseguire la definizione di alias come comando, oppure puoi sorgente .bashrc eseguendo . ~/.bashrc .

Questo probabilmente va contro il punto principale di dir - che dovrebbe produrre lo stesso tipo di output indipendentemente dal dispositivo di output. Tuttavia:

  • Se ritieni utile questo alias dir , dovresti farlo sicuramente.
  • Quando viene chiamato come comando esterno, ad esempio negli script o se si esegue l'override dell'alias eseguendo \dir o command dir , dir produrrà comunque output indipendente dal dispositivo. Questo vuol dire che l'aliasing dir in dir --color=auto in realtà non rompe dir .
risposta data Eliah Kagan 29.04.2015 - 18:15
4
  

Sarei propenso a pensare che dir sia solo per indietro   compatibilità .

     

Da GNU Coreutils :

     
    

dir è equivalente a ls -C -b; cioè, per impostazione predefinita i file sono elencati in colonne, ordinati verticalmente e vengono rappresentati caratteri speciali     da backslash escape sequences.

  
     

A proposito, ls non colora l'output di default: questo è   perché la maggior parte delle distro alias ls in ls --color=auto in   %codice%. Per un test, digita /etc/profile.d , quindi prova unalias ls : lo farà   essere incolore.

Fonte: Renan 's risposta a Qual è la differenza tra "Dir" e "ls" ?

    
risposta data Zlatan 14.09.2013 - 18:40
2

Risposta breve: nessuna, dir è un alias di ls , come dice @Rinzwind, ls ha --color di default

    
risposta data Francisco Valdez 13.02.2012 - 19:26
2

In caso di dubbio, confronta type ls con type dir (vedi anche Differenza tra 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+"[email protected]"}
}
$ echo command ls $LS_OPTIONS ${1+"[email protected]"}
command ls -N --color=tty -T 0

La differenza si riduce a diverse opzioni a ls , nel mio caso --color=tty sarebbe il più visibile, il tuo sistema potrebbe essere diverso.

    
risposta data user2394284 22.12.2016 - 22:45

Leggi altre domande sui tag