Sebagaimana dirinci dalam izin gaya "755" dengan 'ls' oleh Adam Courtemanche di AgileAdam.com , Anda dapat membuat alias lso yang bertindak seperti ls -ltetapi sedikit memproses output 1 untuk menampilkan izin juga di oktal. Ini menambahkan kolom terkemuka yang menunjukkan izin oktal tiga digit dua digit . Seperti yang ditulis, ini berfungsi untuk sebagian besar file dan direktori, tetapi tidak berfungsi dengan baik jika bit sticky atau setuid / setgid diatur. 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}'"
Namun, ini memiliki kelemahan serius, seperti yang ditunjukkan oleh techtonik . Anda tidak dapat meneruskan argumen ke alias ini seperti yang Anda lakukan pada perintah , karena argumen tersebut diambil sebagai argumen tambahan . Dengan demikian Anda tidak dapat berjalan pada file atau direktori tertentu, Anda juga tidak bisa meneruskan opsi apa pun (seperti , atau ) ke .lsolsawklso-F--colorlso
Cara mengatasinya adalah untuk mendefinisikan lso sebagai fungsi daripada 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}'; }
Jika Anda mencoba ini secara interaktif di shell Anda, jalankan unalias lsountuk menghapus alias - Anda dapat melakukannya sebelum atau setelah Anda mendefinisikan fungsi. Jika Anda memasukkannya ke file yang bersumber, seperti ~/.bashrc, ambil saja aliasbaris dan tambahkan definisi fungsi.
Mengapa ini bekerja? Tidak seperti alias, fungsi bash shell dapat mengambil parameter posisi , yaitu argumen baris perintah . "$@"meluas ke daftar argumen lengkap , menyebabkan argumen untuk lsofungsi diteruskan ls. (Tidak seperti definisi alias, badan fungsi tidak dikutip; karena itu perlu untuk menghapus \karakter sebelum $dan ".)
Karena Anda dapat meneruskan opsi lsoketika didefinisikan sebagai fungsi, Anda mungkin ingin menghapus -adan -Gopsi dari definisi - Anda dapat meneruskannya secara manual jika Anda menginginkannya. ( The -lopsi diperlukan untuk rincian seperti hak akses file yang akan ditampilkan sama sekali , sehingga tidak ada manfaat untuk menghapus itu.)
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}'; }
Terima kasih kepada techtonik untuk menunjukkan batasan dalam mendefinisikan lsosebagai alias, sehingga memotivasi saya untuk memperluas posting ini dengan materi tentang menjadikannya fungsi.
1 Orang mungkin memperhatikan bahwa ini tampaknya melanggar aturan umum tentang tidak mem-parsing output darils . lsmenghasilkan keluaran yang sangat bisa dibaca manusia; ini memperkenalkan kekhasan dan keterbatasan sehingga secara umum tidak cocok sebagai input untuk perintah lain. Dalam hal ini kami menguraikan lskarena kami ingin mempertahankan perilaku yang tepatls kecuali satu perubahan kami yang ditambahkan.
2 Satu batasan alias ini, yang juga berlaku untuk versi fungsi yang ditunjukkan di bawahnya, dan yang dapat dianggap bug, adalah bahwa ia hanya menampilkan tiga digit oktal bahkan ketika digit oktal keempat adalah nol. Sebagai jfmercer telah benar menunjukkan , angka oktal yang ditampilkan di sini tidak mencerminkan sedikit lengket jika sekarang, maupun setuid atau setgid bit.
3 Lebih serius dari sekedar tidak menunjukkan digit oktal keempat adalah bahwa metode ini mengasumsikan mereka tidak diatur, dan jika mereka - jika Anda melihat t, satau Sdalam izin string yang - maka Anda harus mengabaikan digit oktal . Ini karena bit disimpulkan dari string izin dengan cara yang tidak memperhitungkan bit setuid / setgid yang lengket.