Как подробно описано в «755» -Style разрешений с «LS» от Адама Courtemanche на AgileAdam.com , вы можете создать псевдоним lso
, который действует как , ls -l
но немного обрабатывает выход 1 с разрешениями дисплея также в восьмеричной системе . Это добавляет начальный столбец, показывающий трехзначные 2 восьмеричные разрешения. Как написано, это работает для большинства файлов и каталогов, но не работает должным образом, если установлены биты sticky или 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}'; }
Спасибо techtonik за то, что он указал на ограничение в определении lso
псевдонима, мотивируя меня расширить этот пост материалом о том, чтобы сделать его вместо этого функцией.
1 Можно заметить, что это нарушает общее правило о том, что неls
нужно анализировать выходные данные из . ls
производит очень удобочитаемый вывод; это вводит идиосинкразии и ограничения, делающие его вообще непригодным в качестве ввода для других команд. В этом случае мы выполняем синтаксический анализ, ls
поскольку хотим сохранить точное поведение,ls
кроме одного добавленного нами изменения.
2 Одно из ограничений этого псевдонима, которое также применяется к версии функции, показанной ниже, и которая может рассматриваться как ошибка, состоит в том, что он отображает только три восьмеричных цифры, даже когда четвертая восьмеричная цифра равна нулю. Как jfmercer уже справедливо указывал , что восьмеричные цифры , показанные здесь , не отражают липкий бит , если он присутствует, ни Setuid или setgid бит.
- Более серьезно , чем просто не показывает четвертую восьмеричную цифры является то , что этот метод предполагает , что они не установлены, и если они есть - если вы видите t
, s
или S
в строке разрешения - то вы должны игнорировать восьмеричные цифры . Это связано с тем, что биты выводятся из строки разрешений таким образом, что не учитываются липкие биты setuid / setgid.