Як докладно описано в «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.