Ich habe versucht, den Unterschied zwischen der Verwendung der Befehle dir
und ls
im Terminal zu finden. Ich weiß, dass es sich bei ls um die traditionelle UNIX-Methode zum Anzeigen der Dateien in einem Verzeichnis dir
handelt. Dies entspricht der Windows-Eingabeaufforderung, aber beide Befehle funktionieren im Terminal.
Wenn ich dir
es eingebe, werden die Dateien und Ordner im Verzeichnis angezeigt, und wenn ich es eingebe ls
, geschieht dasselbe, mit Ausnahme der hervorgehobenen Inhalte. Beide Befehle akzeptieren Optionen (dh ls -a
und dir -a
beide geben alle Dateien und Ordner sowie versteckte Dateien zurück.
Weiß also jemand, was der Unterschied ist und warum beide dir
und ls
verwendet werden?
command-line
directory
ls
coreutils
BretD
quelle
quelle
dir --color
;)Antworten:
dir
undls
sind Teil voncoreutils
unddir
fast gleichls
, nur mit verschiedenen Standardoptionen.info dir
sagt:Oh und da ist auch
vdir
!info vdir
sagt:Besteht höchstwahrscheinlich
dir
aus Gründen der Abwärtskompatibilität oder aus historischen Gründen.quelle
alias dir
zu sehen, was es tatsächlich ist. Geben Sie einalias
, um alle Aliase anzuzeigen.type dir
um zu sehen , was es ist (eine Alias, ein Befehl, eine bash - Funktion ...)Die Beziehung zwischen
ls
unddir
ls
unddir
sind separate Programme, die sich ähnlich verhalten. Wie nachstehend erläutert und referenziert, besteht der Zweckdir
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
:dir
ein Alias istls
, aber das ist nicht der Fall. Keiner der Befehle ist ein Alias des anderen und standardmäßig in Ubuntu überhauptdir
kein Alias.ls
unddir
werden von separaten, nicht identischen ausführbaren Dateien bereitgestellt.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
unddir
unterscheiden?Beide
ls
unddir
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 (wiels -C
) aufgelistet . Wenn es sich bei der Standardausgabe nicht um ein Terminal handelt (z. B. eine Datei oder eine Pipe ), werdenls
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 (wiels -C
) aufgelistet .Für beide
ls
unddir
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 Beispieldir
wird ein Eintrag namens ListeDocuments backups
alsDocuments\ backups
. Das ist wiels -b
.Für beide
ls
unddir
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ürls
/ zutreffendir
: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 separatesdir
Dienstprogramm erstellt, um dies zu erreichen. Somitdir
ist nicht das Dienstprogramm , das seltsam aus Gründen der historischen compatibility-- verhältls
ist .Um zu sehen , wie
ls
,dir
und die damit verbundenenvdir
Nutzen sind in der coreutils Quellcode ohne unnötige Code - Duplizierung durchgeführt, siehels-dir.c
,ls-ls.c
,ls-vdir.c
,ls.h
, undls.c
.Ist das
dir
wirklich nützlich?Wenn Sie jemals eine
ls
mehrspaltige Ausgabe erstellt haben möchten, obwohl Sie sie anless
(ls | less
) weitergeleitet oder in eine Datei umgeleitet haben (ls > out.txt
), können Siedir
oder verwendenls -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 Siedir
oder verwendenls -b
.dir
ist äquivalent zuls -Cb
, also in diesem Sinne brauchen Sie nichtdir
. Aberdir
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
(geradels -Cb
) aber nichtdir
?!Die meisten Ubuntu-Benutzer haben einen Aliasnamen,
ls
der ausgeführt wirdls --color=auto
. Wennls
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 derls
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
odervdir
(und einigen anderen Befehlen wiegrep
)--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
:Sie werden feststellen, dass der
ls
Alias (alias ls='ls --color=auto'
) nicht kommentiert ist, während die fürdir
undvdir
auskommentiert sind,#
damit sie keine Wirkung haben. Das heißt, währenddir
kein Alias ist,ls
ist (aber nicht zudir
) .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:dir
Alias zu erstellen, sollten Sie dies auf jeden Fall tun.\dir
oder überschreibencommand dir
,dir
wird weiterhin eine geräteunabhängige Ausgabe erstellt. Dies bedeutet, dass das Aliasingdir
aufdir --color=auto
nicht wirklich unterbrochen wirddir
.quelle
Quelle: Renan ‚s Antwort auf Was ist der Unterschied zwischen‚dir‘und‚ls‘ ?
quelle
dir
sich nicht aus Gründen der Rückwärtskompatibilität zur Verfügung gestellt --undls
tatsächlich ist --Dieser Antwort (und die Antwort aus zitiert) nicht korrekt den technischen Unterschied zwischen den beiden Befehle als Erläuterung der häufigsten beobachteten colorization Unterschied auch angeben. Also +1.Vergleichen Sie im Zweifelsfall
type ls
vstype dir
(siehe auch Unterschied zwischen ls und la ):Der Unterschied resultiert aus verschiedenen Optionen
ls
. In meinem Fall ist--color=tty
dies am deutlichsten. Ihr System kann davon abweichen.quelle
ls
einen Alias für eine Funktion namens hatte_ls
- nicht einmal als auskommentierte Zeile.bashrc
. Es scheint jedoch die Standardeinstellung für (zumindest einige Versionen von) openSuSE zu sein, gemessen an dieser Konversation , dieser (von dort verknüpften) Datei und meinem (zugegebenermaßen möglicherweise falschen) Gedächtnis, als ich das letzte Mal openSUSE verwendet habe.Kurze Antwort: Keine,
dir
ist die gleiche Quellcode alsls
,ls
binäre hat--color
standardmäßig. (1 Codezeile diff)quelle
dir
ist kein Alias vonls
. Sie sind separate Binärdateien in/usr/bin
das sich anders verhalten, wie sie in der Rinzwind ‚s Antwort . Sie könnten dies mit Aliasen erreichen, aber so wird es nicht erreicht. Separatedir
undls
Binärdateien werden auf allen Systemen angezeigt , die GNU Coreutils verwenden . Wenn Sie Beweise brauchen, laufen Siecmp /bin/ls /bin/dir
.alias
. Jetzt wird eine neue Binärdatei für dir kompiliert. Sie können ihren Code herunterladen mit:git clone git://git.sv.gnu.org/coreutils
. In ls-dir.c wird nur eine Codezeile geändertint ls_mode = LS_MULTI_COL;
. Technisch ist es kein Alias, aber praktisch ist es LS, aber mit verschiedenen Standardoptionen (1 Codezeile).dir
istls
aber mit anderen Standardoptionen .dir
und warenls
schon immer separate Binärdateien in Distributionen, die GNU Coreutils verwenden. Einige Distributionen haben möglicherweise auch einen Aliasnamen definiertdir
(das Definieren von Aliasnamen, die denselben Namen wie ein vorhandener Befehl haben, ist ziemlich häufig). Es handelt sich jedoch um separate ausführbare Dateien. Die Unterscheidung zwischen einem Shell-Alias (der überhaupt keine Datei ist) und einer separaten ausführbaren Datei mit ähnlichem Quellcode ist keine umständliche Unterscheidung. Es ist sowohl falsch als auch irreführend zu sagen, dass diesdir
ein Alias fürls
Ubuntu ist.alias
dann ist es natürlich kein Alias.