Conforme detalhado em permissões de estilo "755" com "ls" por Adam Courtemanche em AgileAdam.com , você pode criar um um alias lso
que atua como ls -l
mas processa ligeiramente a saída 1 para exibir permissões também em octal. Isso adiciona uma coluna à esquerda mostrando permissões octal de três dígitos 2 . Conforme escrito, isso funciona para a maioria dos arquivos e diretórios, mas não funciona corretamente se o adesivo ou setuid/setgid estão definidos. 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}'"
Isso tem uma lacuna séria, no entanto, como techtonik pontos . Você não pode passar argumentos para este lso
alias como você faria para o comando ls
, porque são considerados como argumentos adicionais para awk
em vez disso. Portanto, você não pode executar lso
em um arquivo ou diretório específico, nem pode passar nenhuma opção (como -F
ou --color
) para lso
.
A correção é definir lso
como uma função em vez de um alias.
lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Se você estiver tentando isso interativamente em seu shell, execute unalias lso
para remover o alias - você pode fazer isso antes ou depois de definir a função. Se você for colocá-lo em um arquivo originado, como ~/.bashrc
, apenas retire a linha alias
e adicione a definição da função.
Por que isso funciona? Ao contrário dos aliases, funções do shell bash podem receber parâmetros posicionais , ou seja, argumentos da linha de comando . "$@"
expande para a lista completa de argumentos , causando argumentos para o lso
função a ser passada para ls
. (Diferentemente de uma definição de alias, um corpo de função não é citado; portanto, era necessário remover os caracteres \
antes de $
e "
.)
Como você pode passar opções para lso
quando definido dessa forma como uma função, você pode querer remover as opções -a
e -G
da definição - você pode passá-las manualmente nos casos em que você as deseja . ( A opção -l
é necessária para detalhes como permissões de arquivo a serem mostradas , então não há nenhum benefício em removê-lo.
lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
Obrigado ao techtonik por apontando a limitação na definição de lso
como um alias, motivando-me assim a expanda este post com material sobre como torná-lo uma função.
1 Pode-se notar que isso parece desrespeitar a regra geral sobre não analisar a saída de ls
. ls
produz uma saída legível para humanos; isso introduz idiossincrasias e limitações, tornando-a geralmente inadequada como entrada para outros comandos. Nesse caso, analisamos ls
, já que desejamos preservar o comportamento exato de ls
, exceto nossa uma alteração adicionada.
2 Uma limitação deste alias, que também se aplica à versão da função mostrada abaixo, e que pode ser considerado um bug, é que apenas exibe três dígitos octal mesmo quando o quarto dígito octal é zero. Como jfmercer tem corretamente apontado , os dígitos octal exibido aqui não reflete o bit pegajoso se presente, nem setuid ou setgid bits.
3 Mais seriamente do que simplesmente não mostrar o quarto dígito octal é que este método assume que eles não estão definidos, e < strong> se eles forem - se você vir t
, s
ou S
na cadeia de permissão - então você deve desconsiderar os dígitos octal . Isso porque os bits são inferidos da string de permissões de uma maneira que não considera bits setuid / setgid fixos.