Як докладно описано в «755» -Style дозволів з «LS» від Адама Courtemanche на AgileAdam.com , ви можете створити псевдонім lso , який діє як , ls -lале трохи обробляє вихід 1 з дозволами дисплея також в вісімковій системі . До цього додається провідний стовпчик, що показує трицифрові дозволи на 2 вісімки. Як написано, це працює для більшості файлів і каталогів, але воно не працює належним чином, якщо встановлені липкі або 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}'"
Це серйозний недолік, хоча, як techtonik вказує . Ви не можете передати аргументи в цей lsoпсевдонім , як якщо б до в lsкоманді , тому що вони будуть прийняті в якості додаткових аргументів awkзамість. Таким чином, ви не можете запускати lsoпевний файл чи каталог, а також не можете передавати будь-які варіанти (наприклад -F, або --color) lso.
Виправлення полягає у визначенні lso як функції, а не псевдоніму.
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}'; }
Якщо ви інтерактивно випробовуєте це в оболонці, запустіть, unalias lsoщоб видалити псевдонім - це можна зробити до або після того, як ви визначите функцію. Якщо ви розміщуєте його у створеному файлі, наприклад ~/.bashrc, просто вийдіть aliasрядок та додайте визначення функції.
Чому це працює? На відміну від псевдонімів, функції оболонки bash можуть приймати позиційні параметри , тобто аргументи командного рядка . "$@"розширюється до повного списку аргументів , внаслідок чого аргументи lsoфункції передаються ls. (На відміну від визначення псевдоніму, функціональне тіло не цитується; тому потрібно було видалити \символи до $і ".)
Оскільки ви можете передати параметри, lsoколи це визначено як функцію, ви можете видалити параметри -aта -Gпараметри з визначення - ви можете передавати їх вручну в тих випадках, коли ви хочете їх. ( Цей -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}'; }
Дякую техніку за те, що вказав на обмеження у визначенні lsoпсевдоніма, тим самим мотивуючи мене розширити цю посаду матеріалом про те, щоб зробити її замість неї функцією.
1 Можна відзначити, що, здається, спливає загальне правило про несинтез результатівls . lsдає дуже читаний для людини вихід; це вводить ідіосинкразії та обмеження, що робить його взагалі непридатним як вхід для інших команд. В цьому випадку ми розбираємо , lsтак як ми хочемо , щоб зберегти точна поведінкаls , крім нашого одного доданого зміни.
2 Одне обмеження цього псевдоніму, яке також стосується версії функції, показаної під ним, і яку можна вважати помилкою, полягає в тому, що він відображає лише три восьмі цифри, навіть якщо четверта восьми цифра дорівнює нулю. Як jfmercer вже справедливо вказував , що восьмеричні цифри , показані тут , не відображають липкий біт , якщо він присутній, ні Setuid або setgid біт.
- Більш серйозно , ніж просто не показує четверту восьмеричну цифри є те , що цей метод передбачає , що вони не встановлені, і якщо вони є - якщо ви бачите t, sабо Sв рядку дозволу - то ви повинні ігнорувати восьмеричні цифри . Це тому, що біти виводяться з рядка дозволів таким чином, щоб не враховувати липкі біти setuid / setgid.