Die Beziehung zwischen lsunddir
lsund dirsind separate Programme, die sich ähnlich verhalten. Wie nachstehend erläutert und referenziert, besteht der Zweck dirdarin, einen Befehl bereitzustellen, lsdessen Ausgabe nicht davon abhängt, ob er zu einem Terminal geht oder nicht . Um dies zu erreichen, dirmuss 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
direin Alias ist ls, aber das ist nicht der Fall. Keiner der Befehle ist ein Alias des anderen und standardmäßig in Ubuntu überhaupt dirkein Alias. lsund dirwerden 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. lsverhä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 lsund dirunterscheiden?
Beide lsund dirlisten den Inhalt von Verzeichnissen auf. Zwei spezifische Unterschiede in ihrem Standardverhalten unterscheiden sie.
Wenn die Standardausgabe ein Terminal ist, werden lsdie 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 lsdie Dateinamen in einer Zeile aufgelistet (z. B. ls -1).
Unabhängig davon, ob die Standardausgabe ein Terminal ist oder nicht, werden dirdie Dateinamen in vertikal sortierten Spalten (wie ls -C) aufgelistet .
Für beide lsund dirkönnen diese Vorgaben durch die außer Kraft gesetzt werden --format=Flagge und von den -1, -C, -m, und -xFahnen, 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 ) lsgedruckt . Wenn die Standardausgabe kein Terminal ist, werden die Steuerzeichen unverändert gedruckt .?ls -qlsls --show-control-chars
Unabhängig davon, ob es sich bei der Standardausgabe um ein Terminal handelt oder nicht, werden bei der dirErkennung 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 dirwird ein Eintrag namens Liste Documents backupsals Documents\ backups. Das ist wie ls -b.
Für beide lsund dirkö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 dirDienstprogramm 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 lsoder shnicht 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 dirProgramm zur Verfügung, mit der
lsAusnahme, 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 lsvernünftigerweise nicht geschrieben werden konnte, um das Gerät unabhängig zu verhalten, wurde ein separates dirDienstprogramm erstellt, um dies zu erreichen. Somit dirist nicht das Dienstprogramm , das seltsam aus Gründen der historischen compatibility-- verhält lsist .
Um zu sehen , wie ls, dirund die damit verbundenen vdirNutzen 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 dirwirklich nützlich?
Wenn Sie jemals eine lsmehrspaltige 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 diroder verwenden ls -C.
Wenn Sie sich jemals gewünscht haben, dass Sie einen Dateinamen, der durch angezeigt wird, direkt kopieren lsund als Teil eines Befehls verwenden können, ohne sich Gedanken über das Zitieren zu machen , können Sie diroder verwenden ls -b.
dirist äquivalent zu ls -Cb, also in diesem Sinne brauchen Sie nicht dir. Aber dirbietet 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, lsder ausgeführt wird ls --color=auto. Wenn lsder 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 lsBefehl, mit dem der lsAlias aufruft --color=auto. Weitere Informationen zur Funktionsweise von Aliasen finden Sie unter 6.6 Aliase im Bash-Referenzhandbuch .
Bei der Übergabe an ls, diroder vdir(und einigen anderen Befehlen wie grep) --color=autowird 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 lsAlias ( alias ls='ls --color=auto') nicht kommentiert ist, während die für dirund vdirauskommentiert sind, #damit sie keine Wirkung haben. Das heißt, während dirkein Alias ist, lsist (aber nicht zu dir) .
Wie kann ich auch direine farbige Ausgabe erzeugen?
Um die farbige Ausgabe mit zu aktivieren dir, bearbeiten .bashrcSie 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, dirwird 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 , .bashrcindem Sie . ~/.bashrc.
Dies dirwiderspricht 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
dirAlias 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
\diroder überschreiben command dir, dirwird weiterhin eine geräteunabhängige Ausgabe erstellt. Dies bedeutet, dass das Aliasing dirauf dir --color=autonicht wirklich unterbrochen wird dir.
dir --color;)