Wie detailliert in „755“ -Stil Erlaubnissen ‚ls‘ von Adam Courtemanche auf AgileAdam.com , können Sie erstellen eine Alias lso
, der wie wirkt ls -l
aber verarbeitet leicht den Ausgang 1 zu Anzeigeberechtigungen auch in Oktal. Dies fügt eine führende Spalte mit dreistelligen 2- Oktal-Berechtigungen hinzu. Wie geschrieben funktioniert dies für die meisten Dateien und Verzeichnisse, aber es funktioniert nicht richtig, wenn die Sticky- oder Setuid / Setgid- Bits gesetzt sind. 3
alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"
Dies hat einen ernsten Mangel, obwohl, wie Techtonik weist darauf hin . Sie können diesem lso
Alias keine Argumente wie dem ls
Befehl übergeben , da sie awk
stattdessen als zusätzliche Argumente verwendet werden. Sie können daher weder lso
eine bestimmte Datei oder ein bestimmtes Verzeichnis ausführen , noch Optionen (wie -F
oder --color
) übergeben lso
.
Der Fix besteht darin, lso
eine Funktion anstatt eines Alias zu definieren .
lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Wenn Sie dies interaktiv in Ihrer Shell ausprobieren, führen Sie den Befehl aus, unalias lso
um den Alias zu entfernen. Dies können Sie entweder vor oder nach der Definition der Funktion tun. Wenn Sie es in eine Datei einfügen, deren Quelle beispielsweise ist ~/.bashrc
, nehmen Sie einfach die alias
Zeile heraus und fügen Sie die Funktionsdefinition hinzu.
Warum funktioniert das? Im Gegensatz zu Aliasen können Bash-Shell-Funktionen Positionsparameter , dh Befehlszeilenargumente, annehmen . "$@"
Erweitert die vollständige Argumentliste , wodurch Argumente an die lso
Funktion übergeben werden ls
. (Im Gegensatz zu einer Alias-Definition wird ein Funktionskörper nicht in Anführungszeichen gesetzt. Daher mussten die \
Zeichen vor $
und entfernt werden "
.)
Da Sie Optionen übergeben können, lso
wenn Sie auf diese Weise als Funktion definiert wurden, möchten Sie möglicherweise die -a
und -G
-Optionen aus der Definition entfernen. Sie können sie in Fällen, in denen Sie sie möchten, manuell übergeben. ( Die -l
Option ist für Details wie Dateiberechtigungen erforderlich angezeigt wird überhaupt , so gibt es keinen Vorteil , es zu entfernen.)
lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Dank Techtonik für den Hinweis auf die Einschränkung bei der Definition lso
als Alias, also ich motivierend diesen Beitrag mit Material erweitern darüber eine Funktion stattdessen zu machen.
1 Man kann feststellen, dass dies gegen die allgemeine Regells
zu verstoßen scheint, dass die Ausgabe von nicht analysiert wird . ls
Erzeugt eine sehr gut lesbare Ausgabe. Dies führt zu Besonderheiten und Einschränkungen, die es im Allgemeinen als Eingabe für andere Befehle ungeeignet machen. In diesem Fall analysieren wir, ls
da wir das exakte Verhalten vonls
bis auf unsere einzige hinzugefügte Änderung beibehalten möchten .
2 Eine Einschränkung dieses Alias, die auch für die darunter gezeigte Funktionsversion gilt und als Fehler angesehen werden kann, besteht darin, dass nur drei Oktalziffern angezeigt werden, auch wenn die vierte Oktalziffer Null ist. Wie jfmercer hat zu Recht darauf hingewiesen , zeigten die Oktalziffern hier spiegeln nicht das Sticky - Bit , falls vorhanden, noch setuid oder setgid - Bits.
3 Noch gravierender ist als nicht nur den vierten Oktalziffer zeigt ist , dass diese Methode übernimmt sie nicht festgelegt ist, und wenn sie - wenn Sie sehen t
, s
oder S
in der Berechtigungszeichenfolge - dann sollten Sie die Oktalziffern außer Acht lassen . Dies liegt daran, dass die Bits in einer Weise aus der Berechtigungszeichenfolge abgeleitet werden, die klebrige setuid / setgid-Bits nicht berücksichtigt.