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 -l
mais 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 lso
alias comme à la ls
commande , car ils sont considérés comme des arguments supplémentaires awk
. Ainsi, vous ne pouvez pas exécuter lso
sur 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 lso
pour 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 alias
ligne 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 lso
fonction 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 à lso
une fonction définie de cette manière, vous souhaiterez peut-être supprimer les options -a
et -G
de la définition. Vous pouvez les transmettre manuellement dans les cas où vous le souhaitez. ( L' -l
option 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 lso
comme 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
. ls
produit 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 ls
puisque 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
, s
ou S
dans 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.