Was macht der Befehl l?

19

Auf lmeinem Computer ist ein Befehl verfügbar, der scheinbar nichts zu tun hat. which lerzeugt auch keine Ausgabe. Ist das ein echter Befehl und macht er überhaupt etwas?

Armand
quelle

Antworten:

20

list ein Alias für ls -CF, der sich anders als normal verhältls .

-C

-Cmacht lsin Säulenform Druckausgabe. Wenn stdout ein Terminal ist (anstatt zu einer Datei oder einem Nicht-Terminal-Gerät umgeleitet oder an einen anderen Befehl weitergeleitet zu werden), -Cwird dies impliziert. Laufen ls -Cist also dasselbe wie Laufen ls. Sie sind jedoch nicht gleichwertig, wenn sie lsumgeleitet oder weitergeleitet werden. Beispielsweise:

ek@Kip:~/firefox$ ls
application.ini             libfreebl3.chk    libxpcom.so
blocklist.xml               libfreebl3.so     libxul.so
chrome                      libmozalloc.so    mozilla-xremote-client
chrome.manifest             libmozsqlite3.so  omni.ja
components                  libnspr4.so       platform.ini
crashreporter               libnss3.so        plugin-container

...

ek@Kip:~/firefox$ ls | less

application.ini
blocklist.xml
chrome
chrome.manifest
components
crashreporter

...

Im Gegensatz dazu werden ls -C(oder -l) Ausgaben in Spaltenform ausgegeben, unabhängig davon, um welche Art von Gerät es sich stdouthandelt. ls -C | lesssieht aus wie die Top-Ausgabe (aber lessnatürlich ausgelagert von ).

-F

Der größte sichtbare Unterschied zwischen lsund list auf das -FFlag zurückzuführen, durch das lssymbolische Suffixe (sogenannte Indikatoren) an die angezeigten Einträge angehängt werden. Diese Anzeigen kennzeichnen die Art der Datei oder des Verzeichnisses.

Vergleichen Sie dies mit der Ausgabe des ersten lsobigen Befehls:

ek@Kip:~/firefox$ ls -F
application.ini             libfreebl3.chk     libxpcom.so*
blocklist.xml               libfreebl3.so*     libxul.so*
chrome/                     libmozalloc.so*    mozilla-xremote-client*
chrome.manifest             libmozsqlite3.so*  omni.ja
components/                 libnspr4.so*       platform.ini
crashreporter*              libnss3.so*        plugin-container*

...

Hier:

  • / bedeutet, dass der Eintrag ein Verzeichnis ist.
  • *bedeutet, dass der Eintrag eine normale Datei ist und ausführbar ist (dh über ausführbare Berechtigungen verfügt ).
  • Das Fehlen eines Indikators bedeutet, dass der Eintrag eine normale Datei ist, die nicht ausführbar ist.

Es gibt mehrere andere Indikatoren:

Die --classifyFlagge und --indicator-style=classifysind gleichbedeutend mit -F.

Quelle: GNU Coreutils-Handbuch , Abschnitt 10.1.5 Allgemeine Ausgabeformatierung

Zusammenfassend ist l( ls -CF) ähnlich, aber nicht dasselbe wie ls.

Es ist auch gut zu beachten:

Der gleiche Text kann sowohl ein regulärer Befehl als auch ein Alias ​​sein.

Dies wird häufig verwendet, um Optionen anzugeben, die allgemein als äußerst nützlich und harmlos angesehen werden, z. B. die automatische Einfärbung (wenn die Farbe nicht stdoutumgeleitet wird oder ein Terminal ist, werden die Escape-Codes, die Farben angeben, so gut wie garantiert nicht falsch interpretiert).

Nach diesem Prinzip lsist selbst ein Pseudonym.

ek@Kip:/$ alias ls
alias ls='ls --color=auto'

Welcher Befehl wird also wirklich ausgeführt, wenn Sie ausführen l? Dieses:

/bin/ls --color=auto -CF
  1. Die shell ( bash) löst Befehle auf, die /beim ersten Auftauchen in PATH, was in Ubuntu für lsist , kein a enthalten /bin/ls.
  2. Aliase können Aliase enthalten. Die Aliasauflösung ist nicht rekursiv (ein Alias ​​kann sich nicht selbst aufrufen, obwohl er einen regulären Befehl mit demselben Namen aufrufen kann). Aber es unterstützt das Verschachteln .

Also llöst auf, ls -CFwas auflöst ls --color=auto -CF.

Aliase können geändert werden.

Diese Aliase existieren, weil sie standardmäßig so eingerichtet sind, aber jeder Benutzer kann ihre Aliase ändern. Siehe man alias, Kapitel 25 und Anhang M in der Advanced Bash-Scripting Guide und wie speichern meine "alias" Einträge für immer .

Verwandte: Was bedeuten die verschiedenen Farben in ls?

Eliah Kagan
quelle
6

Eigentlich sind beide lsund lgleich

raja@badfox:~/Pictures$ l
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png
raja@badfox:~/Pictures$ ls
des.png
Screenshot from 2012-09-22 19:37:03.png
Screenshot from 2012-09-22 19:37:11.png
Screenshot from 2012-09-22 19:37:12.png
Untitled.png

Warum bedeutet dies, dass ein integrierter Systemalias vorhanden ist? Wenn Sie sehen möchten, öffnen Sie Ihr Terminal und geben aliasSie Folgendes ein: Sie erhalten eine Ausgabe wie diese

raja@badfox:~/Pictures$ alias
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias lock='gnome-screensaver-command -l'
alias ls='ls --color=auto'
alias sms='php .sms.php'
raja@badfox:~/Pictures$ 
rɑːdʒɑ
quelle
Rätsel gelöst :)
Armand
6
@Alison lund plain lssind nicht dasselbe - sie haben nur zufällig die gleiche Ausgabe für diese bestimmten Dateien erzeugt, da es sich bei keiner um Verzeichnisse, ausführbare Dateien, Symlinks oder Geräteknoten handelte (und die Standardausgabe war ein Terminal).
Eliah Kagan
Sie können sehen, alias l='ls -CF'es ist also nicht dasselbe. Wenn Sie eine prägnantere Ausgabe erhalten möchten, können Sie auch ausführen alias l.
wjandrea