Sebagaimana dirinci dalam izin gaya "755" dengan 'ls' oleh Adam Courtemanche di AgileAdam.com , Anda dapat membuat alias lso
yang bertindak seperti ls -l
tetapi 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 .lso
ls
awk
lso
-F
--color
lso
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 lso
untuk menghapus alias - Anda dapat melakukannya sebelum atau setelah Anda mendefinisikan fungsi. Jika Anda memasukkannya ke file yang bersumber, seperti ~/.bashrc
, ambil saja alias
baris 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 lso
fungsi diteruskan ls
. (Tidak seperti definisi alias, badan fungsi tidak dikutip; karena itu perlu untuk menghapus \
karakter sebelum $
dan "
.)
Karena Anda dapat meneruskan opsi lso
ketika didefinisikan sebagai fungsi, Anda mungkin ingin menghapus -a
dan -G
opsi dari definisi - Anda dapat meneruskannya secara manual jika Anda menginginkannya. ( The -l
opsi 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 lso
sebagai 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
. ls
menghasilkan 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 ls
karena 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
, s
atau S
dalam 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.