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


74

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

Se lo digito dir, visualizza i file e le cartelle nella directory e, se lo digito ls, fa lo stesso, tranne che per l'evidenziazione del contenuto. Entrambi i comandi accettano opzioni (cioè ls -aed dir -aentrambi restituiscono tutti i file e le cartelle e i file nascosti.

Qualcuno sa qual è la differenza e perché entrambi dire lsvengono utilizzati?


7
dir --color;)
Rinzwind,

3
volevo solo dire che sono sorpreso dalla quantità di risposta che questa domanda ha ricevuto. Immagino di non essere stato l'unico a chiedersi questo :)
BretD,

3
I comandi dei tempi antichi trascinano sempre i secchioni più vecchi fuori dalla lavorazione del legno;)
Rinzwind

Risposte:


70

dire lsfanno parte di coreutilsed dirè quasi uguale a 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 utility principali che dovrebbero esistere su ogni sistema operativo.

info dir dice:

dirè equivalente a ls -C -b; ovvero, per impostazione predefinita, i file sono elencati in colonne, ordinati verticalmente e i caratteri speciali sono rappresentati da sequenze di escape con barra rovesciata.

Oh e c'è anche vdir! info vdirdice:

vdirè equivalente a ls -l -b; ovvero, per impostazione predefinita, i file sono elencati in formato lungo e i caratteri speciali sono rappresentati da sequenze di escape con barra rovesciata.

Molto probabilmente diresiste per compatibilità con le versioni precedenti o per motivi storici.


Stavo pensando che probabilmente era solo un alias dell'altro. Ho pensato che il ragionamento fosse quello di far sentire gli utenti di Windows più a loro agio lol Grazie per la risposta completa!
BretD,

4
digita alias dirper vedere di cosa si tratta. digita aliasper vedere tutti gli alias.
user606723,

2
@ user606723, 'alias dir' non viene visualizzato in 11.10 (almeno non per me). Credo che 'alias' mostri solo le impostazioni dell'alias utente locale, non a livello di sistema.
James,

digita type dirper vedere di cosa si tratta (un alias, un comando, una funzione bash ...)
ychaouche

49

La relazione tra lsedir

lse dirsono programmi separati che si comportano in modo simile. Come spiegato e indicato di seguito, lo scopo di dirè fornire un comando come il lscui output non varia a seconda che vada o meno a un terminale . Per ottenere ciò in modo utile, è dirnecessario formattare l'output in modo ragionevole e utile sia per la visualizzazione in un terminale sia per la scrittura in un file o pipe.

Esistono due idee sbagliate comuni su dir:

  • Molte persone credono che dirsia un alias di ls, ma non è così. Nessuno dei due comandi è un alias dell'altro e per impostazione predefinita in Ubuntu dirnon è affatto un alias. lse dirsono forniti da eseguibili separati, non identici.
  • Molte persone credono che diresista per oscuri motivi storici o per garantire la compatibilità con alcuni standard o altri sistemi operativi. Neanche questo è il caso. lssi comporta come per compatibilità. dir, che non deve essere compatibile perché non è un comando Unix standard, si comporta in modo alternativo che gli sviluppatori considerano prezioso a sé stante e forse anche preferibile.

OK, ma esattamente come si fa lse dirdifferiscono?

Entrambi lsed direlencano i contenuti delle directory. Due differenze specifiche nei loro comportamenti predefiniti li distinguono.

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

    Indipendentemente dal fatto che l'output standard sia un terminale, direlenca i nomi dei file in colonne ordinate verticalmente (come ls -C).

    Per entrambi lse dirquesti default possono essere sovrascritte dalla --format=bandiera e dai -1, -C, -m, e -xle bandiere, che abbreviare particolari --format=opzioni. Vedere 10.1.4 Formattazione generale dell'output nel manuale di riferimento di GNU coreutils per i dettagli.

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

    Indipendentemente dal fatto che l'output standard sia un terminale, quando dirincontra un carattere di controllo o qualsiasi altro carattere che sarebbe interpretato appositamente se inserito in una shell, stampa sequenze di barre rovesciate per i personaggi. Ciò include anche personaggi relativamente comuni come gli spazi. Ad esempio, direlencherà una voce chiamata Documents backupscome Documents\ backups. Questo è come ls -b.

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

Fonti : ls invocazione e l'invocazione dir , nelle coreutils GNU manuale di riferimento .

Perché dir?

La logica di dirun'utilità separata è fornita in 4.5 Standard per le interfacce Generalmente 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:

Si prega di non fare in modo che il comportamento di un'utilità dipenda dal nome usato per invocarlo ....

Invece, usa un'opzione di runtime o un interruttore di compilazione o entrambi per selezionare tra i comportamenti alternativi ....

Allo stesso modo, si prega di non fare in modo che il comportamento di un programma da riga di comando dipenda dal tipo di dispositivo di output ....

La compatibilità richiede che determinati programmi dipendano dal tipo di dispositivo di output. Sarebbe disastroso se lso shnon lo facesse nel modo previsto da tutti gli utenti. In alcuni di questi casi, integriamo il programma con una versione alternativa preferita che non dipende dal tipo di dispositivo di output. Ad esempio, forniamo un dirprogramma molto simile, lstranne per il fatto che il suo formato di output predefinito è sempre il formato a più colonne.

Il Progetto GNU ritiene 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 utility, incluso l' lsoutput dipendente dal dispositivo, è necessario per la compatibilità e quindi funziona come gli utenti si aspettano. Alcuni utenti preferiscono in modo specifico questo comportamento dipendente dal dispositivo.

Sebbene lsnon sia stato ragionevolmente possibile scrivere per comportarsi in modo indipendente dal dispositivo, è dirstata creata un'utilità separata per raggiungere questo obiettivo. Così dirnon è l'utility che si comporta in modo strano, per ragioni di compatibility-- storica lsè .

Per vedere come ls, dire il relativo vdirprogramma di utilità sono implementati nel codice sorgente di coreutils senza duplicazione di codice inutile, vedere ls-dir.c, ls-ls.c, ls-vdir.c, ls.h, e ls.c.

È dirdavvero utile?

Se hai mai desiderato lsprodurre output multi-colonna anche quando lo hai reindirizzato a less( ls | less) o reindirizzato a un file ( ls > out.txt), puoi usare diro ls -C.

Se hai mai desiderato poter copiare direttamente un nome file mostrato da lse usarlo come parte di un comando senza preoccuparti di quotare , puoi usare diro ls -b.

direquivale a ls -Cb, quindi in tal senso non è necessario dir. Ma dirfornisce una combinazione di opzioni che in pratica sono spesso utili (anche se non ampiamente conosciute).

Perché ottengo un output colorato ls(anche ls -Cb) ma no dir?!

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

Le definizioni degli alias non vengono espanse in modo ricorsivo: è il lscomando esterno con cui l' lsalias sta chiamando --color=auto. Vedere 6.6 Alias nel manuale di riferimento di Bash per ulteriori informazioni sul funzionamento degli alias.

Quando viene passato a ls, diro vdir(e alcuni altri comandi, come grep), --color=autoutilizza colore quando la sua uscita è 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' lsalias ( alias ls='ls --color=auto') è senza commenti, mentre quelli per dire vdirsono commentati in #modo che non abbiano effetto. Cioè, mentre dirnon è un alias, lsè (ma non per dir) .

Come posso dirprodurre anche stampe colorate?

Per abilitare l'output colorato con dir, basta modificare .bashrcnella home directory e rimuovere il commento dalla #alias dir='dir --color=auto'riga rimuovendo il comando iniziale #. Nelle shell avviate dopo la modifica, dirsarà un alias.

Se si desidera la modifica nella shell corrente, è possibile eseguire la definizione di alias come comando oppure eseguire l'origine .bashrceseguendo . ~/.bashrc.

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

  • Se ritieni utile creare questo diralias, dovresti sicuramente farlo.
  • Se chiamato come comando esterno, ad esempio negli script o se si sostituisce l'alias eseguendo \diro command dir, dirsi produrrà comunque un output indipendente dal dispositivo. Questo per dire che aliasing dira dir --color=autorealtà non rompe dir.

Risposta di qualità, ma potrebbe usare un ToC o TL; DR; :)
Kevin,

5

Sarei propenso a pensare che dirsia lì solo per compatibilità con le versioni precedenti .

Da GNU Coreutils :

dir è equivalente a ls -C -b; ovvero, per impostazione predefinita, i file sono elencati in colonne, ordinati verticalmente e i caratteri speciali sono rappresentati da sequenze di escape con barra rovesciata.

Tra l'altro, lsnon colorare l'output di default: questo è perché la maggior parte delle distribuzioni alias lsa ls --color=autoin /etc/profile.d. Per un test, digita unalias lsquindi prova ls: sarà incolore.

Fonte: la risposta di Renan a Qual è la differenza tra "dir" e "ls" ?


Anche se dirè non disponibile per compatibilità --e lsrealtà è --questo risposta (e la risposta si cita) non indicare correttamente la differenza tecnica tra i due comandi oltre a spiegare la differenza colorizzazione comunemente osservato. Quindi +1.
Eliah Kagan,

3

In caso di dubbio, confronta type lsvs 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+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

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


2
Questa non sembra affatto una configurazione utente predefinita di Ubuntu. Non credo che nessuno dei sistemi Ubuntu che ho usato abbia avuto lscome alias per una funzione chiamata _ls- nemmeno come linea commentata .bashrc. Sembra il valore predefinito per (almeno alcune versioni di) openSuSE, tuttavia, a giudicare da questa conversazione , questo file (collegato da lì) e la mia memoria (certamente errata) di quando ho usato openSUSE l'ultima volta.
Eliah Kagan,

2
@EliahKagan: hai indovinato, sto usando OpenSuse! Quindi, come ho detto, il risultato sarà diverso, ma il metodo dovrebbe andare bene.
user2394284

2

Risposta breve: nessuna, dirè lo stesso codice sorgente che ls, per impostazione predefinita , il lsbinario ha --color. (1 riga di codice diff)


7
dirnon è un alias di ls. Sono binari separati in /usr/binche comportarsi in modo diverso, come descritto in Rinzwind 's risposta . Si potrebbe ottenere questo con gli alias, ma non è così che si ottiene. Separati dire lsbinari appaiono su tutti i sistemi che usano GNU Coreutils . Se hai bisogno di prove, corri cmp /bin/ls /bin/dir.
Eliah Kagan,

2
qualche tempo fa era un alias e lo si poteva vedere nell'elenco degli alias semplicemente digitando alias, ora un nuovo binario viene compilato per dir. È possibile scaricare il suo codice con: git clone git://git.sv.gnu.org/coreutils. Solo una riga di codice viene cambiato in ls-dir.c ed è questo: int ls_mode = LS_MULTI_COL;. Tecnicamente non è un alias, ma praticamente è LS ma con diverse opzioni predefinite (1 riga di codice).
Francisco Valdez,

1
Sì, dirè lsma con diverse opzioni di default . dire lssono sempre stati binari separati nelle distribuzioni che usano GNU Coreutils. Alcune distribuzioni possono, o potrebbero aver, anche definito un alias chiamato dir(definire alias che hanno lo stesso nome di un comando esistente è abbastanza comune). Ma sono eseguibili separati. Distinguere tra un alias di shell (che non è affatto un file) e un eseguibile separato con un codice sorgente simile, non è una distinzione pedante. È sia falso che fuorviante affermare che dirè un alias di lsUbuntu.
Eliah Kagan,

Sì, sono d'accordo con te, ma in questo caso non è un codice sorgente simile, è lo stesso codice sorgente. Se diciamo che un alias è solo qualcosa elencato, aliasovviamente non è un alias.
Francisco Valdez,

3
Non è lo stesso codice sorgente. Come hai detto, "una riga di origine è cambiata". E se fosse la stessa fonte, non sarebbe ancora un alias. Ci sono molte cose in un sistema simile a Unix che sono simili agli alias ma che sarebbero molto confusi per i principianti (e esasperanti per gli utenti esperti) per chiamare gli alias. Collegamenti simbolici, collegamenti reali, file identici, file simili, script wrapper, eseguibili nascosti della shell che nascondono eseguibili e file sincronizzati (ad esempio con UbuntuOne) sono tutti simili agli alias in modo significativo, ma non sono alias.
Eliah Kagan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.