Wie detailliert in „755“ -Stil Erlaubnissen ‚ls‘ von Adam Courtemanche auf AgileAdam.com , können Sie erstellen eine Alias lso , der wie wirkt ls -laber 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 lsoAlias keine Argumente wie dem lsBefehl übergeben , da sie awkstattdessen als zusätzliche Argumente verwendet werden. Sie können daher weder lsoeine bestimmte Datei oder ein bestimmtes Verzeichnis ausführen , noch Optionen (wie -Foder --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 lsoum 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 aliasZeile 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 lsoFunktion ü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, lsowenn Sie auf diese Weise als Funktion definiert wurden, möchten Sie möglicherweise die -aund -G-Optionen aus der Definition entfernen. Sie können sie in Fällen, in denen Sie sie möchten, manuell übergeben. ( Die -lOption 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 lsoals 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 . lsErzeugt 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, lsda 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, soder Sin 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.