Обновленная система и Firefox теперь не позволят мне вводить тильды или backquotes

Как указано в «755» -стильных разрешениях с помощью «ls» Adam Courtemanche на AgileAdam.com, вы можете создать псевдоним lso, который действует как ls -l, но слегка обрабатывает output1 для отображения разрешений также в восьмеричном. Это добавляет главный столбец с восьмеричными разрешениями из трех цифр. Как написано, это работает для большинства файлов и каталогов, но оно не работает должным образом, если установлены литые или 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}'"

Это имеет серьезный недостаток, хотя, поскольку [d1 ] Указывает «755» -стильные разрешения с 'ls' . Вы Adam Courtemanche к этому псевдониму lso, как и к команде ls, потому что вместо этого они приняты как дополнительные аргументы AgileAdam.com . Таким образом, вы не можете запустить 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 могут принимать позиционные параметры, т. Е. команда ls . "$@" расширяется до полного списка аргументов, в результате чего аргументы функции lso передаются на ls. (В отличие от определения псевдонима, тело функции не цитируется, поэтому необходимо было удалить символы \ до $ и ".)

Поскольку вы можете передать параметры lso если этот способ определен как функция, вы можете удалить опции -a и -G из определения - вы можете передать их вручную в тех случаях, когда вы хотите их использовать. ( Функции оболочки bash могут принимать позиционные параметры , поэтому нет никакой пользы для его удаления.)

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, кроме нашего добавленного изменения.

1 Можно заметить, что это кажется пренебрегайте общим правилом о не анализируя вывод из ls. ls дает очень понятный для человека вывод; это вводит идиосинкразии и ограничения, что делает его в целом неприемлемым как вход для других команд. В этом случае мы проанализируем ls, так как хотим сохранить точное поведение ls, кроме нашего добавленного изменения.

1 Более серьёзно, чем просто не показывать четвертую восьмеричную цифру, заключается в том, что этот метод В этом случае они не установлены, и если они есть - если вы видите t, s или [ f34] в строке разрешения - тогда вы должны игнорировать восьмеричные цифры. Это связано с тем, что биты выводятся из строки разрешений способом, который не учитывает липкие биты setuid / setgid.

1
задан 24 December 2012 в 06:27

0 ответов

Другие вопросы по тегам:

Похожие вопросы: