Unterschied zwischen 'dir' und 'ls' Terminalbefehlen?

74

Ich habe versucht, den Unterschied zwischen der Verwendung der Befehle dirund lsim Terminal zu finden. Ich weiß, dass es sich bei ls um die traditionelle UNIX-Methode zum Anzeigen der Dateien in einem Verzeichnis dirhandelt. Dies entspricht der Windows-Eingabeaufforderung, aber beide Befehle funktionieren im Terminal.

Wenn ich dires 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 -aund dir -abeide geben alle Dateien und Ordner sowie versteckte Dateien zurück.

Weiß also jemand, was der Unterschied ist und warum beide dirund lsverwendet werden?

BretD
quelle
7
dir --color;)
Rinzwind
3
Ich wollte nur sagen, ich bin überrascht über die Menge an Antworten, die diese Frage erhalten hat. Ich glaube, ich war nicht der einzige, der sich darüber wunderte :)
BretD
3
Befehle aus alten Zeiten ziehen immer die älteren Nerds aus dem Holzwerk;)
Rinzwind

Antworten:

70

dirund lssind Teil von coreutilsund dirfast gleich ls, nur mit verschiedenen Standardoptionen.

Die GNU Core Utilities sind die grundlegenden Hilfsprogramme zur Datei-, Shell- und Textbearbeitung des GNU-Betriebssystems. Dies sind die Kerndienstprogramme, die voraussichtlich auf jedem Betriebssystem vorhanden sind.

info dir sagt:

dirist gleichbedeutend mit ls -C -b; Das heißt, Dateien werden standardmäßig in Spalten aufgelistet und vertikal sortiert. Sonderzeichen werden durch Escape-Sequenzen mit umgekehrten Schrägstrichen dargestellt.

Oh und da ist auch vdir! info vdirsagt:

vdirist gleichbedeutend mit ls -l -b; Das heißt, Dateien werden standardmäßig im Langformat aufgelistet, und Sonderzeichen werden durch Escape-Sequenzen mit umgekehrten Schrägstrichen dargestellt.

Besteht höchstwahrscheinlich diraus Gründen der Abwärtskompatibilität oder aus historischen Gründen.

Rinzwind
quelle
Ich dachte, dass es wahrscheinlich nur ein Alias ​​des anderen war. Ich ging davon aus, dass Windows-Benutzer sich wie zu Hause fühlen sollten. Lol Vielen Dank für die gründliche Antwort!
BretD
4
Geben Sie ein, um alias dirzu sehen, was es tatsächlich ist. Geben Sie ein alias, um alle Aliase anzuzeigen.
user606723
2
@ user606723, 'alias dir' wird in 11.10 nicht angezeigt (zumindest nicht für mich). Ich glaube, "Alias" zeigt nur lokale Benutzer-Alias-Einstellungen, nicht systemweit.
James
geben , type dirum zu sehen , was es ist (eine Alias, ein Befehl, eine bash - Funktion ...)
ychaouche
49

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.

  1. 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 .

  2. 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.
Eliah Kagan
quelle
Qualitätsantwort, könnte aber ein ToC oder TL verwenden; DR; :)
Kevin
5

Ich würde gerne denken, dass dires nur aus Gründen der Abwärtskompatibilität gibt .

Aus GNU Coreutils :

dir ist äquivalent zu ls -C -b; Das heißt, Dateien werden standardmäßig in Spalten aufgelistet und vertikal sortiert. Sonderzeichen werden durch Escape-Sequenzen mit umgekehrten Schrägstrichen dargestellt.

By the way, lskolorieren nicht den Ausgang standardmäßig: Das ist , weil die meisten Distros alias lszu ls --color=autoin /etc/profile.d. Geben Sie für einen Test unalias lsdann Folgendes ein ls: Es wird farblos.

Quelle: Renan ‚s Antwort auf Was ist der Unterschied zwischen‚dir‘und‚ls‘ ?

Zlatan
quelle
Obwohl dirsich nicht aus Gründen der Rückwärtskompatibilität zur Verfügung gestellt --und lstatsä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.
Eliah Kagan
3

Vergleichen Sie im Zweifelsfall type lsvs type dir(siehe auch Unterschied zwischen ls und la ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

Der Unterschied resultiert aus verschiedenen Optionen ls. In meinem Fall ist --color=ttydies am deutlichsten. Ihr System kann davon abweichen.

user2394284
quelle
2
Dies scheint überhaupt keine Standard-Ubuntu-Benutzerkonfiguration zu sein. Ich glaube nicht, dass eines der Ubuntu-Systeme, die ich verwendet habe, lseinen 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.
Eliah Kagan
2
@EliahKagan: Du hast es erraten, ich benutze OpenSuse! Wie gesagt, das Ergebnis wird sich unterscheiden, aber die Methode sollte in Ordnung sein.
user2394284
2

Kurze Antwort: Keine, dirist die gleiche Quellcode als ls, lsbinäre hat --colorstandardmäßig. (1 Codezeile diff)

Francisco Valdez
quelle
7
dirist kein Alias ​​von ls. Sie sind separate Binärdateien in /usr/bindas sich anders verhalten, wie sie in der Rinzwind ‚s Antwort . Sie könnten dies mit Aliasen erreichen, aber so wird es nicht erreicht. Separate dirund lsBinärdateien werden auf allen Systemen angezeigt , die GNU Coreutils verwenden . Wenn Sie Beweise brauchen, laufen Sie cmp /bin/ls /bin/dir.
Eliah Kagan
2
Vor einiger Zeit war es ein Alias ​​und Sie konnten sehen, dass es in der Aliasliste aufgeführt ist, indem Sie einfach Folgendes eingeben 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ändert int ls_mode = LS_MULTI_COL;. Technisch ist es kein Alias, aber praktisch ist es LS, aber mit verschiedenen Standardoptionen (1 Codezeile).
Francisco Valdez
1
Ja, dirist lsaber mit anderen Standardoptionen . dirund waren lsschon immer separate Binärdateien in Distributionen, die GNU Coreutils verwenden. Einige Distributionen haben möglicherweise auch einen Aliasnamen definiert dir(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 dies direin Alias ​​für lsUbuntu ist.
Eliah Kagan
Ja, ich stimme Ihnen zu, aber in diesem Fall handelt es sich nicht um einen ähnlichen Quellcode, sondern um denselben Quellcode. Wenn wir sagen, dass ein Alias ​​nur irgendetwas in der Liste ist, aliasdann ist es natürlich kein Alias.
Francisco Valdez
3
Es ist nicht der gleiche Quellcode. Wie Sie sagten, "eine Zeile der Quelle wird geändert." Und wenn es die gleiche Quelle wäre, dann wäre es immer noch kein Alias. Es gibt viele Dinge in einem Unix-ähnlichen System, die Aliase ähneln , aber für Anfänger (und erfahrene Benutzer) äußerst verwirrend wären, Aliase aufzurufen. Symbolische Links, harte Links, identische Dateien, ähnliche Dateien, Wrapper-Skripte, Shell-Builtins, die ausführbare Dateien verbergen, und synchronisierte Dateien (z. B. mit UbuntuOne) ähneln in erheblichem Maße Aliasen, sind jedoch keine Aliasen.
Eliah Kagan