Como se detalla en los permisos de estilo "755" con 'ls' de Adam Courtemanche en AgileAdam.com , puede crear un alias lso que actúe ls -lpero procese ligeramente la salida 1 para mostrar los permisos también en octal. Esto agrega una columna inicial que muestra los permisos octales de dos dígitos de tres dígitos . Como está escrito, esto funciona para la mayoría de los archivos y directorios, pero no funciona correctamente si los pegajosos o setuid / setgid se establecen bits. 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}'"
Sin embargo, esto tiene una grave deficiencia, como señala techtonik . No puede pasar argumentos a este alias como lo haría con el comando , porque en su lugar se toman como argumentos adicionales . Por lo tanto, no puede ejecutarse en un archivo o directorio específico, ni puede pasar ninguna opción (como o ) .lsolsawklso-F--colorlso
La solución es definir lso como una función en lugar de 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 está probando esto de forma interactiva en su shell, ejecute unalias lsopara eliminar el alias; puede hacerlo antes o después de definir la función. Si lo está colocando en un archivo de origen, por ejemplo ~/.bashrc, simplemente saque la aliaslínea y agregue la definición de la función.
¿Por qué funciona esto? A diferencia de los alias, las funciones de shell bash pueden tomar parámetros posicionales , es decir, argumentos de línea de comandos . "$@"se expande a la lista de argumentos completa , haciendo lsoque se pasen argumentos a la función ls. (A diferencia de una definición de alias, no se cita un cuerpo de función; por lo tanto, era necesario eliminar los \caracteres antes $y ").
Dado que puede pasar opciones a lsocuando se define de esta manera como una función, es posible que desee eliminar las opciones -ay -Gde la definición; puede pasarlas manualmente en los casos en que las desee. ( El -lse requiere opción para detalles como los permisos de archivo que se muestra en absoluto , por lo que no hay ningún beneficio a retirarlo.)
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}'; }
Gracias a techtonik por señalar la limitación en la definición lsocomo un alias, lo que me motivó a expandir esta publicación con material sobre cómo convertirla en una función.
1 Uno puede notar que esto parece ignorar la regla general sobre no analizar la salida dels . lsproduce una salida muy legible para el ser humano; Esto introduce idiosincrasias y limitaciones, por lo que generalmente no es adecuado como entrada para otros comandos. En este caso analizamos lsya que deseamos preservar el comportamiento exacto dels excepto nuestro único cambio agregado.
2 Una limitación de este alias, que también se aplica a la versión de la función que se muestra debajo, y que puede considerarse un error, es que solo muestra tres dígitos octales incluso cuando el cuarto dígito octal es cero. Como jfmercer ha señalado correctamente , los dígitos octales que se muestran aquí no reflejan el bit adhesivo si está presente, ni los bits setuid o setgid.
3 Más serio que simplemente no mostrar el cuarto dígito octal es que este método asume que no se han establecido, y si son - si usted ve t, so Sen la serie de permiso - entonces usted debe ignorar los dígitos octales . Esto se debe a que los bits se infieren de la cadena de permisos de una manera que no tiene en cuenta los bits fijos setuid / setgid.