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 -l
pero 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 ) .lso
ls
awk
lso
-F
--color
lso
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 lso
para 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 alias
lí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 lso
que 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 lso
cuando se define de esta manera como una función, es posible que desee eliminar las opciones -a
y -G
de la definición; puede pasarlas manualmente en los casos en que las desee. ( El -l
se 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 lso
como 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
. ls
produce 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 ls
ya 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
, s
o S
en 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.