Come dettagliato nelle autorizzazioni in stile "755" con "ls" di Adam Courtemanche su AgileAdam.com , è possibile creare un alias lso
che agisce come ls -l
ma elabora leggermente l'output 1 per visualizzare le autorizzazioni anche in ottale. Ciò aggiunge una colonna iniziale che mostra le autorizzazioni ottali a 2 cifre a tre cifre . Come scritto, questo funziona per la maggior parte dei file e delle directory, ma non funziona correttamente se sono impostati i bit sticky o setuid / setgid . 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}'"
Ciò ha una grave lacuna, tuttavia, come sottolinea Techtonik . È Non è possibile passare argomenti a questo alias come si farebbe per il comando , perché sono presi come argomenti aggiuntivi a posto. Pertanto non è possibile eseguire su un file o una directory specifici, né è possibile passare alcuna opzione (come , o ) a .lso
ls
awk
lso
-F
--color
lso
La correzione è definire lso
come una funzione piuttosto che 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}'; }
Se lo stai provando in modo interattivo nella tua shell, corri unalias lso
per rimuovere l'alias: puoi farlo prima o dopo aver definito la funzione. Se lo stai inserendo in un file di provenienza, ad esempio ~/.bashrc
, elimina la alias
riga e aggiungi la definizione della funzione.
Perché funziona? A differenza degli alias, le funzioni della shell bash possono assumere parametri posizionali , cioè argomenti della riga di comando . "$@"
si espande all'elenco completo degli argomenti , causando il passaggio degli argomenti alla lso
funzione ls
. (A differenza di una definizione di alias, un corpo di funzione non è citato; quindi è stato necessario rimuovere i \
caratteri prima $
e "
.)
Dal momento che puoi passare le opzioni a lso
quando definite in questo modo come una funzione, potresti voler rimuovere le opzioni -a
e -G
dalla definizione - puoi passarle manualmente nei casi in cui le desideri. ( L' -l
opzione è necessaria per dettagli come i permessi dei file per essere mostrato a tutti , quindi non c'è beneficio per rimuoverlo.)
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}'; }
Grazie a techtonik per aver sottolineato la limitazione nella definizione lso
di alias, motivandomi così ad espandere questo post con materiale per renderlo invece una funzione.
1 Si può notare che questo sembra infrangere la regola generale di non analizzare l'output dals
. ls
produce output molto leggibili dall'uomo; questo introduce idiosincrasie e limitazioni che lo rendono generalmente inadatto come input per altri comandi. In questo caso analizziamo ls
poiché desideriamo preservare il comportamento esattols
tranne il nostro unico cambiamento aggiunto.
2 Una limitazione di questo alias, che si applica anche alla versione della funzione mostrata di seguito, e che può essere considerata un bug, è che visualizza solo tre cifre ottali anche quando la quarta cifra ottale è zero. Come jfmercer ha giustamente osservato , le cifre ottali qui visualizzati non riflettono lo sticky bit se bit presenti, nè setuid o setgid.
3 Più seriamente che semplicemente non mostra la quarta cifra ottale è che questo metodo presuppone che non sono impostati, e se sono - se si vede t
, s
o S
nella stringa di permesso - allora si dovrebbe ignorare le cifre ottali . Questo perché i bit vengono dedotti dalla stringa dei permessi in un modo che non tiene conto dei bit appiccicosi setuid / setgid.