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 -lama 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 lsosize 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 .lsawklso-F--colorlso
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, aliassatı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 , lsoiş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 .)$"
lsoBu şekilde bir işlev olarak tanımlandığında seçenekleri geçebildiğiniz için , -ave -Gseç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 lsobu ş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 lsberi 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, sya Sizin 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.