Jak wyszczególniono w „755” -Style uprawnień z „ls” przez Adama Courtemanche na AgileAdam.com , można utworzyć alias lso
, który działa jak ls -l
ale nieznacznie przetwarza wyjście 1 do uprawnień wyświetlacza również w ósemkowym. Dodaje to wiodącą kolumnę pokazującą trzycyfrowe uprawnienia 2- ósemkowe. Jak napisano, działa to w przypadku większości plików i katalogów, ale nie działa poprawnie, jeśli ustawione są bity lepkie lub 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}'"
Ma to jednak poważną wadę , jak wskazuje techtonik . Państwo nie może przekazywać argumenty do tego lso
aliasu tak jak do tej ls
komendy , ponieważ są one traktowane jako dodatkowe argumenty awk
zamiast. W związku z tym nie można uruchamiać lso
określonego pliku lub katalogu ani przekazywać żadnych opcji (takich jak -F
lub --color
) do lso
.
Rozwiązaniem jest zdefiniowanie lso
jako funkcji, a nie aliasu.
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}'; }
Jeśli wypróbowujesz to interaktywnie w swojej powłoce, uruchom, unalias lso
aby usunąć alias - możesz to zrobić przed lub po zdefiniowaniu funkcji. Jeśli umieszczasz go w pliku źródłowym, takim jak ~/.bashrc
, po prostu wyjmij alias
linię i dodaj definicję funkcji.
Dlaczego to działa? W przeciwieństwie do aliasów, funkcje powłoki bash mogą przyjmować parametry pozycyjne , tj . Argumenty wiersza poleceń . "$@"
rozwija się do pełnej listy argumentów , powodując przekazanie argumentów do lso
funkcji ls
. (W przeciwieństwie do definicji aliasu, treść funkcji nie jest cytowana; dlatego konieczne było usunięcie \
znaków przed $
i "
.)
Ponieważ możesz przekazać opcje, lso
gdy zdefiniujesz w ten sposób jako funkcję, możesz usunąć opcje -a
i -G
z definicji - możesz przekazać je ręcznie w przypadkach, w których chcesz. ( Opcja jest wymagana do informacji takich jak uprawnienia do plików mają być wyświetlane w ogóle , więc nie ma korzyści do usuwania go.)-l
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}'; }
Dzięki techtonik za wskazanie ograniczenia w definiowaniu lso
jako alias, co zmotywowało mnie do rozszerzenia tego postu o materiał na temat uczynienia go zamiast tego funkcją.
1 Można zauważyć, że wydaje się to lekceważyć ogólną zasadę nie analizowania wynikówls
. ls
zapewnia wyjście bardzo czytelne dla człowieka; wprowadza to osobliwości i ograniczenia, przez co ogólnie nie nadaje się jako dane wejściowe dla innych poleceń. W tym przypadku analizujemy, ls
ponieważ chcemy zachować dokładne zachowaniels
oprócz naszej jednej dodanej zmiany.
2 Jednym z ograniczeń tego aliasu, który ma również zastosowanie do pokazanej poniżej wersji funkcji i który można uznać za błąd, jest to, że wyświetla on tylko trzy cyfry ósemkowe, nawet gdy czwarta cyfra ósemkowa wynosi zero. Jak jfmercer został słusznie zauważył , cyfry ósemkowe wyświetlane tutaj nie odzwierciedlają sticky bit jeżeli jest obecny, ani suid lub sgid bitów.
3 poważniej niż tylko nie pokazuje czwartą cyfrę ósemkowy jest to, że metoda ta zakłada, że nie są one ustawione, a jeśli są - jeśli widzisz t
, s
lub S
w ciągu uprawnień - to należy lekceważyć cyfry ósemkowe . Jest tak, ponieważ bity są wywnioskowane z ciągu uprawnień w sposób, który nie uwzględnia lepkich bitów setuid / setgid.