Comme détaillé dans les autorisations de type «755» avec «ls» par Adam Courtemanche sur AgileAdam.com , vous pouvez créer un alias lso qui agit comme si, ls -lmais traite légèrement la sortie 1 pour afficher les autorisations également en octal. Cela ajoute une colonne de tête indiquant les autorisations octales à deux chiffres à trois chiffres . Tel qu'écrit, cela fonctionne pour la plupart des fichiers et des répertoires, mais ne fonctionne pas correctement si les bits sticky ou setuid / setgid sont définis. 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}'"
Comme le souligne Techtonik , cela présente toutefois un grave inconvénient . Vous ne pouvez pas transmettre d'arguments à cet lsoalias comme à la lscommande , car ils sont considérés comme des arguments supplémentaires awk. Ainsi, vous ne pouvez pas exécuter lsosur un fichier ou un répertoire spécifique, vous ne pouvez pas non plus transmettre d’option (comme -F, ou --color) à lso.
Le correctif consiste à définir lso une fonction plutôt qu'un 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}'; }
Si vous essayez cela interactivement dans votre shell, exécutez unalias lsopour supprimer l'alias - vous pouvez le faire avant ou après avoir défini la fonction. Si vous le placez dans un fichier source, tel que ~/.bashrc, il suffit de supprimer la aliasligne et d'ajouter la définition de la fonction.
Pourquoi ça marche? Contrairement aux alias, les fonctions du shell bash peuvent prendre des paramètres de position , c'est -à- dire des arguments de ligne de commande . "$@"étend à la liste complète des arguments , entraînant le passage des arguments à la lsofonction ls. (Contrairement à une définition d'alias, aucun corps de fonction n'est cité; il était donc nécessaire de supprimer les \caractères avant $et ".)
Étant donné que vous pouvez transmettre des options à lsoune fonction définie de cette manière, vous souhaiterez peut-être supprimer les options -aet -Gde la définition. Vous pouvez les transmettre manuellement dans les cas où vous le souhaitez. ( L' -loption est requise pour des détails comme les autorisations de fichiers à afficher du tout , donc il n'y a aucun avantage à le retirer.)
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}'; }
Merci à techtonik pour souligner la limitation dans la définition lsocomme un alias, me motive ainsi à étendre ce poste avec du matériel de faire une fonction à la place.
1 On peut noter que cela semble bafouer la règle générale selon laquelle il ne faut pas analyser la sortie dels . lsproduit une sortie très lisible par l'homme; cela introduit des particularités et des limitations qui le rendent généralement inadapté comme entrée pour d'autres commandes. Dans ce cas, nous analysons lspuisque nous souhaitons conserver le comportement exact dels notre seul changement.
2 Une limite de cet alias, qui s'applique également à la version de fonction indiquée ci-dessous, et qui peut être considérée comme un bogue, est qu'elle n'affiche que trois chiffres octaux, même lorsque le quatrième chiffre est zéro. Comme jfmercer l' a fait remarquer à juste titre , les chiffres octaux affichés ici ne reflètent pas le bit collant s'il est présent, ni les bits setuid ou setgid.
3 Plus sérieusement que simplement ne pas montrer le quatrième chiffre octal est que cette méthode suppose qu'ils ne sont pas définies, et si elles sont - si vous voyez t, sou Sdans la chaîne d'autorisation - alors vous devriez ne pas tenir compte des chiffres octaux . Ceci parce que les bits sont déduits de la chaîne d'autorisations d'une manière qui ne prend pas en compte les bits sticky setuid / setgid.