Как подробно описано в «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.