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