Die Beziehung zwischen ls
unddir
ls
und dir
sind separate Programme, die sich ähnlich verhalten. Wie nachstehend erläutert und referenziert, besteht der Zweck dir
darin, einen Befehl bereitzustellen, ls
dessen Ausgabe nicht davon abhängt, ob er zu einem Terminal geht oder nicht . Um dies zu erreichen, dir
muss die Ausgabe in einer Weise formatiert werden, die sowohl für die Anzeige in einem Terminal als auch für das Schreiben in eine Datei oder Pipe sinnvoll und nützlich ist.
Es gibt zwei häufige Missverständnisse über dir
:
- Viele Menschen glauben , dass dies
dir
ein Alias ist ls
, aber das ist nicht der Fall. Keiner der Befehle ist ein Alias des anderen und standardmäßig in Ubuntu überhaupt dir
kein Alias. ls
und dir
werden von separaten, nicht identischen ausführbaren Dateien bereitgestellt.
- Viele Menschen glauben
dir
, dass dies aus obskuren historischen Gründen oder aus Gründen der Kompatibilität mit einem Standard- oder einem anderen Betriebssystem geschieht. Das ist auch nicht der Fall. ls
verhält sich wie für die Kompatibilität. dir
, das nicht kompatibel sein muss, weil es kein standardmäßiger Unix-Befehl ist, verhält sich auf eine andere Art und Weise, die die Entwickler für sich genommen für wertvoll und möglicherweise sogar vorzuziehen halten.
OK, aber genau wie ls
und dir
unterscheiden?
Beide ls
und dir
listen den Inhalt von Verzeichnissen auf. Zwei spezifische Unterschiede in ihrem Standardverhalten unterscheiden sie.
Wenn die Standardausgabe ein Terminal ist, werden ls
die Dateinamen in vertikal sortierten Spalten (wie ls -C
) aufgelistet . Wenn es sich bei der Standardausgabe nicht um ein Terminal handelt (z. B. eine Datei oder eine Pipe ), werden ls
die Dateinamen in einer Zeile aufgelistet (z. B. ls -1
).
Unabhängig davon, ob die Standardausgabe ein Terminal ist oder nicht, werden dir
die Dateinamen in vertikal sortierten Spalten (wie ls -C
) aufgelistet .
Für beide ls
und dir
können diese Vorgaben durch die außer Kraft gesetzt werden --format=
Flagge und von den -1
, -C
, -m
, und -x
Fahnen, die insbesondere abkürzen --format=
Optionen. Weitere Informationen finden Sie unter 10.1.4 Allgemeine Ausgabeformatierung im GNU Coreutils-Referenzhandbuch .
Wenn die Standardausgabe ein Terminal ist und ein aufzulistender Dateiname Steuerzeichen enthält , wird anstelle jedes Steuerzeichens (wie ) ls
gedruckt . Wenn die Standardausgabe kein Terminal ist, werden die Steuerzeichen unverändert gedruckt .?
ls -q
ls
ls --show-control-chars
Unabhängig davon, ob es sich bei der Standardausgabe um ein Terminal handelt oder nicht, werden bei der dir
Erkennung eines Steuerzeichens oder eines anderen Zeichens, das bei Eingabe in eine Shell speziell interpretiert würde, umgekehrte Schrägstriche für die Zeichen ausgegeben . Dies schließt auch relativ häufige Zeichen wie Leerzeichen ein. Zum Beispiel dir
wird ein Eintrag namens Liste Documents backups
als Documents\ backups
. Das ist wie ls -b
.
Für beide ls
und dir
können diese Standardeinstellungen durch die in 10.1.7 Formatieren der Dateinamen im GNU coreutils-Referenzhandbuch aufgelisteten Flags überschrieben werden . Dazu gehören -b
, -q
, --quoting-style=
, und einige andere.
Quellen : ls-Aufruf und dir-Aufruf im GNU coreutils-Referenzhandbuch .
Warum haben dir
?
Die Begründung für ein separates dir
Dienstprogramm finden Sie in 4.5 Standards for Interfaces General der GNU-Codierungsstandards . Ich empfehle, den gesamten Abschnitt zu lesen, um die Argumentation der Entwickler zu verstehen, aber hier sind die Highlights, die für ls
/ zutreffen dir
:
Bitte lassen Sie das Verhalten eines Dienstprogramms nicht von dem Namen abhängen, mit dem es aufgerufen wurde ....
Verwenden Sie stattdessen eine Laufzeitoption oder einen Kompilierungsschalter oder beides, um zwischen den alternativen Verhaltensweisen zu wählen .
Ebenso darf das Verhalten eines Befehlszeilenprogramms nicht vom Typ des Ausgabegeräts abhängen .
Die Kompatibilität erfordert, dass bestimmte Programme vom Typ des Ausgabegeräts abhängen. Es wäre fatal , wenn ls
oder sh
nicht so in der Art und Weise zu tun haben alle Benutzer erwarten. In einigen dieser Fälle ergänzen wir das Programm mit einer bevorzugten alternativen Version, die nicht vom Ausgabegerätetyp abhängt. Zum Beispiel stellen wir ein dir
Programm zur Verfügung, mit der
ls
Ausnahme, dass das Standardausgabeformat immer ein mehrspaltiges Format ist.
Das GNU-Projekt hält es aus technischer Sicht für unerwünscht, dass ein Dienstprogramm je nach Art des Geräts, auf das es schreibt, unterschiedliche Ausgaben erzeugt (zumindest in der Standardkonfiguration des Dienstprogramms). Für einige Dienstprogramme, einschließlich ls
, ist eine geräteabhängige Ausgabe aus Kompatibilitätsgründen erforderlich und funktioniert daher so, wie Benutzer es erwarten. Einige Benutzer bevorzugen dieses geräteabhängige Verhalten auch ausdrücklich.
Obwohl ls
vernünftigerweise nicht geschrieben werden konnte, um das Gerät unabhängig zu verhalten, wurde ein separates dir
Dienstprogramm erstellt, um dies zu erreichen. Somit dir
ist nicht das Dienstprogramm , das seltsam aus Gründen der historischen compatibility-- verhält ls
ist .
Um zu sehen , wie ls
, dir
und die damit verbundenen vdir
Nutzen sind in der coreutils Quellcode ohne unnötige Code - Duplizierung durchgeführt, siehe ls-dir.c
, ls-ls.c
, ls-vdir.c
, ls.h
, und ls.c
.
Ist das dir
wirklich nützlich?
Wenn Sie jemals eine ls
mehrspaltige Ausgabe erstellt haben möchten, obwohl Sie sie an less
( ls | less
) weitergeleitet oder in eine Datei umgeleitet haben ( ls > out.txt
), können Sie dir
oder verwenden ls -C
.
Wenn Sie sich jemals gewünscht haben, dass Sie einen Dateinamen, der durch angezeigt wird, direkt kopieren ls
und als Teil eines Befehls verwenden können, ohne sich Gedanken über das Zitieren zu machen , können Sie dir
oder verwenden ls -b
.
dir
ist äquivalent zu ls -Cb
, also in diesem Sinne brauchen Sie nicht dir
. Aber dir
bietet eine Kombination von Optionen in der Praxis , das oft nützlich ist (wenn auch nicht allgemein bekannt zu).
Warum bekomme ich colorierte Ausgabe von ls
(gerade ls -Cb
) aber nicht dir
?!
Die meisten Ubuntu-Benutzer haben einen Aliasnamen, ls
der ausgeführt wird ls --color=auto
. Wenn ls
der Alias sowohl als Alias als auch als externer Befehl vorhanden ist, hat der Alias Vorrang vor einfachen interaktiven Befehlen.
Aliasdefinitionen werden nicht rekursiv erweitert - es ist der externe ls
Befehl, mit dem der ls
Alias aufruft --color=auto
. Weitere Informationen zur Funktionsweise von Aliasen finden Sie unter 6.6 Aliase im Bash-Referenzhandbuch .
Bei der Übergabe an ls
, dir
oder vdir
(und einigen anderen Befehlen wie grep
) --color=auto
wird Farbe verwendet, wenn die Ausgabe ein Terminal ist, aber nicht anders.
Standardmäßig werden in Ubuntu Benutzerkonten mit folgenden Einstellungen erstellt ~/.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
Sie werden feststellen, dass der ls
Alias ( alias ls='ls --color=auto'
) nicht kommentiert ist, während die für dir
und vdir
auskommentiert sind, #
damit sie keine Wirkung haben. Das heißt, während dir
kein Alias ist, ls
ist (aber nicht zu dir
) .
Wie kann ich auch dir
eine farbige Ausgabe erzeugen?
Um die farbige Ausgabe mit zu aktivieren dir
, bearbeiten .bashrc
Sie sie einfach in Ihrem Home-Verzeichnis und #alias dir='dir --color=auto'
entfernen Sie das führende Zeichen, um die Zeile zu kommentieren #
. In Shells, die nach der Änderung gestartet wurden, dir
wird ein Alias angezeigt.
Wenn Sie die Änderung in der aktuellen Shell mögen, können Sie die Alias - Definition als Befehl ausführen, oder Sie können beziehen , .bashrc
indem Sie . ~/.bashrc
.
Dies dir
widerspricht wohl dem Hauptaspekt von -, dass es unabhängig vom Ausgabegerät die gleiche Art von Ausgabe erzeugen sollte. Jedoch:
- Wenn Sie es nützlich finden, diesen
dir
Alias zu erstellen, sollten Sie dies auf jeden Fall tun.
- Wenn Sie diesen Befehl als externen Befehl aufrufen, z. B. in Skripten, oder wenn Sie den Alias durch Ausführen von
\dir
oder überschreiben command dir
, dir
wird weiterhin eine geräteunabhängige Ausgabe erstellt. Dies bedeutet, dass das Aliasing dir
auf dir --color=auto
nicht wirklich unterbrochen wird dir
.
dir --color
;)