Detaylandırıldığı gibi 'ls' ile “755” tarzı izinleri tarafından Adam Courtemanche üzerinde AgileAdam.com , oluşturabileceğiniz bir takma ad lso
gibi davranır ls -l
ama biraz çıkışını işler 1 de sekizlik ekran izinlerine. Bu, üç basamaklı 2 sekizlik izinlerini gösteren ana bir sütun ekler . Yazıldığı gibi, bu çoğu dosya ve dizin için çalışır, ancak yapışkan veya setuid / setgid bitleri ayarlanmışsa düzgün çalışmaz . 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}'"
Techtonik'in işaret ettiği gibi, bunun ciddi bir eksikliği var . Sen argümanları geçemeyen bu lso
size yaptığınız gibi takma komuta onlar için ek argüman olarak alınır çünkü, bunun yerine. Böylece, belirli bir dosya veya dizinde koşamazsınız ya da herhangi bir seçeneği (gibi veya ) geçiremezsiniz .ls
awk
lso
-F
--color
lso
Düzeltme, takma ad yerine lso
bir işlev tanımlamaktır .
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}'; }
Bunu kabuğunuzda etkileşimli olarak deniyorsanız unalias lso
, diğer adı kaldırmak için çalıştırın - işlevi tanımlamanızdan önce veya sonra yapabilirsiniz. Eğer böyle bir dosyaya koyuyorsanız, örneğin ~/.bashrc
, alias
satırı çıkartın ve fonksiyon tanımını ekleyin.
Bu neden işe yarıyor? Diğer adların aksine, bash shell işlevleri konumsal parametreleri , yani komut satırı argümanlarını alabilir . "$@"
tam argüman listesine genişler ve bu , lso
işleve iletilecek argümanlara neden olur ls
. (Bir diğer ad tanımından farklı olarak, bir işlev gövdesi alıntılanmaz; bu nedenle ve önceki \
karakterleri kaldırmak gerekliydi .)$
"
lso
Bu şekilde bir işlev olarak tanımlandığında seçenekleri geçebildiğiniz için , -a
ve -G
seçenekleri tanımdan kaldırmak isteyebilirsiniz - istediğiniz durumlarda el ile iletebilirsiniz. ( Opsiyon gösterilmesini dosya izinleri gibi detaylar için gereklidir hiç , bu yüzden hiçbir yararı çıkarmadan için vardır.)-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}'; }
Teşekkür etmek techtonik için sınırlama işaret tanımlamada lso
bu şekilde bir işlev yerine bunu yapma konusunda malzeme ile bu yayını genişletmek için beni motive, bir takma ad olarak.
1 Biri bunun , çıktının ayrıştırılmamasıyla ilgili genel kuralıls
aşağıladığını söyleyebilir . ls
çok okunaklı çıktılar üretir; bu, diğer komutlar için girdi olarak genellikle uygun olmadığından, kendi kendine özgüllükler ve sınırlamalar getirmektedir. Bu durumda biz ayrıştırmak ls
beri biz tam davranışını korumak isteyenls
bizim hariç tek eklendi değişim.
2 Bu takma adın, aşağıda gösterilen işlev sürümüne de uygulanan ve bir hata olarak düşünülebilecek bir sınırlaması , dördüncü sekizlik basamak sıfır olduğunda bile, yalnızca üç sekizlik basamak göstermesidir . Gibi jfmercer etti haklı olarak işaret , burada görüntülenen sekizlik rakam yapışkan bit eğer mevcut, ne de setuid veya setgid bit yansıtmamaktadır.
3 Daha ciddi sadece dördüncü sekizlik rakamı gösterilmiyor daha bu yöntem olmasıdır varsayar onlar ayarlanmaz ve görürseniz - eğer olurlarsa t
, s
ya S
izin dizede - o zaman sekizlik basamak göz ardı edilmelidir . Bunun nedeni, bitlerin izin dizesinden yapışkan setuid / setgid bitlerini hesaba katmayacak şekilde çıkarılmasıdır.