it-swarm.com.de

Unterschied zwischen 'dir' und 'ls' Terminalbefehlen?

Ich habe versucht, den Unterschied zwischen der Verwendung der Befehle dir und ls im Terminal zu finden. Ich weiß, dass ls die traditionelle UNIX-Methode zum Anzeigen der Dateien in einem Verzeichnis ist und dass dir die Windows-Eingabeaufforderung ist, aber beide Befehle funktionieren im Terminal.

Wenn ich dir eingebe, werden die Dateien und Ordner im Verzeichnis angezeigt, und wenn ich ls eingebe, geschieht dasselbe, mit Ausnahme der Hervorhebung von Inhalten. Beide Befehle akzeptieren Optionen (d. H. ls -a und dir -a geben alle Dateien und Ordner sowie versteckte Dateien zurück.

Weiß also jemand, was der Unterschied ist und warum sowohl dir als auch ls verwendet werden?

74
BretD

dir und ls sind Teil von coreutils und dir ist fast identisch mit ls, nur mit unterschiedlichen Standardoptionen.

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

info dir sagt:

dir entspricht 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 es gibt auch vdir! info vdir sagt:

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

Höchstwahrscheinlich ist dir aus Gründen der Abwärtskompatibilität oder aus historischen Gründen vorhanden.

69
Rinzwind

Die Beziehung zwischen ls und dir

ls und dir sind separate Programme, die sich ähnlich verhalten. Wie weiter unten erläutert und referenziert, besteht der Zweck von dir darin, einen Befehl wie ls bereitzustellen, dessen Ausgabe nicht davon abhängt, ob er zu einem Terminal geht oder nicht. Um dies zu erreichen, muss dir seine Ausgabe auf eine Weise formatieren, die sowohl zum Anzeigen in einem Terminal als auch zum Schreiben in eine Datei oder Pipe sinnvoll und nützlich ist.

Es gibt zwei häufige Missverständnisse über dir:

  • Viele Leute glauben, dass dir ein Alias ​​von ls ist, aber das ist nicht der Fall. Keiner der Befehle ist ein Alias ​​des anderen, und in Ubuntu ist dir standardmäßig überhaupt kein Alias. ls und dir werden durch separate, nicht identische ausführbare Dateien bereitgestellt.
  • Viele Leute glauben, dass dir aus unklaren historischen Gründen existiert oder um Kompatibilität mit einem Standard- oder einem anderen Betriebssystem zu gewährleisten. 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 Standard-Unix-Befehl ist, verhält sich in einem alternative Art und Weise, die die Entwickler für sich wertvoll und möglicherweise sogar vorzuziehen halten.

OK, aber wie unterscheiden sich ls und dir genau?

Sowohl ls als auch dir listen den Inhalt von Verzeichnissen auf. Zwei spezifische Unterschiede in ihrem Standardverhalten unterscheiden sie.

  1. Wenn sein Standardausgabe ein Terminal ist, listet ls Dateinamen in vertikal sortierten Spalten auf (wie ls -C). Wenn die Standardausgabe kein Terminal ist (z. B. eine Datei oder Pipe ), listet ls Dateinamen pro Zeile auf (wie ls -1).

    Unabhängig davon, ob die Standardausgabe ein Terminal ist oder nicht, listet dir Dateinamen in vertikal sortierten Spalten auf (wie ls -C).

    Sowohl für ls als auch dir können diese Standardwerte durch das Flag --format= und durch die Flags -1, -C, -m und -x überschrieben werden, die bestimmte --format=-Optionen abkürzen. Siehe 10.1.4 Allgemeine Ausgabeformatierung im GNU coreutils Referenzhandbuch für Details.

  2. Wenn die Standardausgabe ein Terminal ist und ein aufzulistender Dateiname Steuerzeichen enthält, gibt ls? anstelle jedes Steuerzeichens (wie ls -q) aus. Wenn die Standardausgabe kein Terminal ist, druckt ls die Steuerzeichen wie sie sind (wie ls --show-control-chars).

    Unabhängig davon, ob es sich bei der Standardausgabe um ein Terminal handelt oder nicht: Wenn dir auf ein Steuerzeichen oder ein anderes Zeichen stößt, das speziell bei der Eingabe in eine Shell interpretiert wird, werden Backslash-Sequenzen für die Zeichen ausgegeben. Dies beinhaltet auch relativ häufige Zeichen wie Leerzeichen. Beispielsweise listet dir einen Eintrag mit dem Namen Documents backups als Documents\ backups auf. Das ist wie ls -b.

    Sowohl für ls als auch dir können diese Standardeinstellungen durch die Flags überschrieben werden, die in 10.1.7 Formatieren der Dateinamen im GNU coreutils reference manual aufgeführt sind =. Dies schließt -b, -q, --quoting-style= und einige andere ein.

Sources: ls invocation und dir invocation im GNU coreutils reference manual .

Warum haben dir?

Die Begründung für ein separates dir -Dienstprogramm ist in 4.5 Standards für Schnittstellen allgemein der GNU-Codierungsstandards angegeben. Ich empfehle, den gesamten Abschnitt zu lesen, um die Argumentation der Entwickler zu verstehen, aber hier sind die Highlights, die für ls/dir zutreffen:

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

Bitte lassen Sie 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 katastrophal, wenn ls oder sh dies nicht in der von allen Benutzern erwarteten Weise tun würden. In einigen dieser Fälle ergänzen wir das Programm mit einer bevorzugten alternativen Version, die nicht vom Ausgabegerätetyp abhängt. Beispielsweise stellen wir ein dir -Programm zur Verfügung, das dem ls sehr ähnlich ist, mit der Ausnahme, dass das Standardausgabeformat immer ein mehrspaltiges Format ist.

Das Projekt GNU 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, damit sie wie vom Benutzer erwartet funktioniert. Einige Benutzer bevorzugen dieses geräteabhängige Verhalten auch ausdrücklich.

Während ls nicht so geschrieben werden konnte, dass sich das Gerät unabhängig verhält, wurde ein separates Dienstprogramm dir erstellt, um dies zu erreichen. Somit ist dir nicht das Dienstprogramm, das sich aus Gründen der historischen Kompatibilität seltsam verhält --ls ist.

Um zu sehen, wie ls, dir und das zugehörige vdir -Dienstprogramm im coreutils-Quellcode ohne unnötige Code-Duplizierung implementiert werden, siehe ls-dir.c , ls-ls.c , ls-vdir.c , ls.h und ls.c .

Ist dir wirklich nützlich?

Wenn Sie jemals gewünscht haben, dass ls eine mehrspaltige Ausgabe erzeugt, auch wenn Sie diese an less (ls | less) weitergeleitet oder in eine Datei (ls > out.txt) umgeleitet haben, können Sie dir oder ls -C verwenden. .

Wenn Sie jemals gewünscht haben, dass Sie einen mit ls angezeigten Dateinamen direkt kopieren und als Teil eines Befehls verwenden könnten, ohne sich Gedanken über das Zitieren zu machen, können Sie dir oder ls -b verwenden.

dir entspricht ls -Cb, in diesem Sinne brauchen Sie dir nicht. Aber dir bietet eine Kombination von Optionen, die in der Praxis oft nützlich sind (obwohl sie nicht allgemein bekannt sind).

Warum erhalte ich eine colorierte Ausgabe von ls (sogar ls -Cb), aber nicht von dir ?!

Die meisten Ubuntu-Benutzer haben einen Alias ​​namens ls, der ls --color=auto ausführt. Wenn ls 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 Befehl ls, den der Alias ​​ls mit --color=auto aufruft. Weitere Informationen zur Funktionsweise von Aliasen finden Sie unter 6.6 Aliase im Bash-Referenzhandbuch .

Bei der Übergabe an ls, dir oder vdir (und einige andere Befehle, wie grep) verwendet --color=auto Farbe, wenn die Ausgabe ein Terminal ist, aber nicht anders.

Standardmäßig werden in Ubuntu Benutzerkonten mit folgendem Code in ~/.bashrc erstellt:

# 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 Alias ​​ls (alias ls='ls --color=auto') nicht kommentiert ist, während die für dir und vdir mit # auskommentiert sind, sodass sie keine Wirkung haben. Das heißt, während dir kein Alias ​​ist, ls ist (aber nicht zu dir).

Wie kann ich dir auch farbige Ausgabe erzeugen?

Um die Farbausgabe mit dir zu aktivieren, bearbeiten Sie einfach .bashrc in Ihrem Home-Verzeichnis und entfernen Sie den führenden #alias dir='dir --color=auto' in der Zeile #. In Shells, die nach der Änderung gestartet wurden, ist dir ein Alias.

Wenn Sie die Änderung in der aktuellen Shell vornehmen möchten, können Sie die Aliasdefinition als Befehl ausführen oder .bashrc durch Ausführen von . ~/.bashrc als Quelle angeben.

Dies steht wohl im Widerspruch zu dem Hauptpunkt von dir, 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, beispielsweise in Skripten, oder wenn Sie den Alias ​​durch Ausführen von \dir oder command dir überschreiben, wird dir weiterhin geräteunabhängig ausgegeben. Dies bedeutet, dass das Aliasing von dir auf dir --color=autodir nicht wirklich bricht.
48
Eliah Kagan

Ich würde gerne denken, dass dir nur aus Gründen der Abwärtskompatibilität vorhanden ist.

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

Übrigens färbt ls die Ausgabe nicht standardmäßig ein: Dies liegt daran, dass die meisten Distributionsaliasnamen ls bis ls --color=auto in /etc/profile.d. Geben Sie für einen Test unalias ls ein und versuchen Sie dann ls: Es wird farblos.

Quelle: Renan 's Antwort to Was ist der Unterschied zwischen "dir" und "ls" ?

5
Zlatan

Im Zweifelsfall vergleichen Sie type ls mit type dir (siehe auch nterschied 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+"[email protected]"}
}
$ echo command ls $LS_OPTIONS ${1+"[email protected]"}
command ls -N --color=tty -T 0

Der Unterschied resultiert aus verschiedenen Optionen für ls. In meinem Fall wäre --color=tty am sichtbarsten. Ihr System kann davon abweichen.

3
user2394284

Kurze Antwort: Keine, dir ist standardmäßig derselbe Quellcode wie ls, ls binär --color. (1 Codezeile diff)

2