La relazione tra ls
edir
ls
e dir
sono programmi separati che si comportano in modo simile. Come spiegato e indicato di seguito, lo scopo di dir
è fornire un comando come il ls
cui output non varia a seconda che vada o meno a un terminale . Per ottenere ciò in modo utile, è dir
necessario 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
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 garantire la compatibilità con alcuni standard o altri sistemi operativi. Neanche questo è il caso. ls
si 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 ls
e dir
differiscono?
Entrambi ls
ed dir
elencano i contenuti delle directory. Due differenze specifiche nei loro comportamenti predefiniti li distinguono.
Quando il suo output standard è un terminale, ls
elenca 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 ), ls
elenca i nomi dei file uno per riga (come ls -1
).
Indipendentemente dal fatto che l'output standard sia un terminale, dir
elenca i nomi dei file in colonne ordinate verticalmente (come ls -C
).
Per entrambi ls
e dir
questi default possono essere sovrascritte dalla --format=
bandiera e dai -1
, -C
, -m
, e -x
le bandiere, che abbreviare particolari --format=
opzioni. Vedere 10.1.4 Formattazione generale dell'output nel manuale di riferimento di GNU coreutils per i dettagli.
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ì come sono (come ls --show-control-chars
).
Indipendentemente dal fatto che l'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 barre rovesciate per i personaggi. Ciò include anche personaggi relativamente comuni come gli spazi. Ad esempio, dir
elencherà una voce chiamata Documents backups
come Documents\ backups
. Questo è come ls -b
.
Per entrambi ls
e 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 dir
un'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 ls
o sh
non 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 dir
programma molto simile,
ls
tranne 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' ls
output 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 ls
non sia stato ragionevolmente possibile scrivere per comportarsi in modo indipendente dal dispositivo, è dir
stata creata un'utilità separata per raggiungere questo obiettivo. Così dir
non è l'utility che si comporta in modo strano, per ragioni di compatibility-- storica ls
è .
Per vedere come ls
, dir
e il relativo vdir
programma 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
.
È dir
davvero utile?
Se hai mai desiderato ls
produrre output multi-colonna anche quando lo hai reindirizzato a less
( ls | less
) o reindirizzato a un file ( ls > out.txt
), puoi usare dir
o ls -C
.
Se hai mai desiderato poter copiare direttamente un nome file mostrato da ls
e usarlo come parte di un comando senza preoccuparti di quotare , puoi usare dir
o ls -b
.
dir
equivale a ls -Cb
, quindi in tal senso non è necessario dir
. Ma dir
fornisce 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 ls
che viene eseguito ls --color=auto
. Quando ls
esiste 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 ls
comando esterno con cui l' ls
alias 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
, dir
o vdir
(e alcuni altri comandi, come grep
), --color=auto
utilizza 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' ls
alias ( alias ls='ls --color=auto'
) è senza commenti, mentre quelli per dir
e vdir
sono commentati in #
modo che non abbiano effetto. Cioè, mentre dir
non è un alias, ls
è (ma non per dir
) .
Come posso dir
produrre anche stampe colorate?
Per abilitare l'output colorato con dir
, basta modificare .bashrc
nella home directory e rimuovere il commento dalla #alias dir='dir --color=auto'
riga rimuovendo il comando iniziale #
. Nelle shell avviate dopo la modifica, dir
sarà un alias.
Se si desidera la modifica nella shell corrente, è possibile eseguire la definizione di alias come comando oppure eseguire l'origine .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. Però:
- Se ritieni utile creare questo
dir
alias, dovresti sicuramente farlo.
- Se chiamato come comando esterno, ad esempio negli script o se si sostituisce l'alias eseguendo
\dir
o command dir
, dir
si produrrà comunque un output indipendente dal dispositivo. Questo per dire che aliasing dir
a dir --color=auto
realtà non rompe dir
.
dir --color
;)