Как включить `sudo` с пользовательскими функциями?

Как включить `sudo` с пользовательскими функциями?

Недавно я узнал, что можно включить sudoпользовательские псевдонимы следующим образом:

alias sudo='sudo ' # note: the space is required!

Причина, по которой это работаетследующее:

Если последний символ значения псевдонима является пробелом или символом табуляции, то следующее за псевдонимом командное слово также проверяется на предмет расширения псевдонима.

У меня вопрос: есть ли способ включить sudoтакже и пользовательские функции?

решение1

В общем случае то, что вы пытаетесь сделать, на самом деле не работает.

При использовании псевдонимов по сути требуется просто перезаписать строку перед ее передачей на выполнение.

Так, например, если у вас есть

alias sudo='sudo '
alias foo='bar baz'

затем при вводе sudo fooкомандная строка переписывается на sudo bar bazичтото, что тогда запускается. Это простое переписывание командной строки.

Теперь функции сложнее. Это не просто переписывание, а полная оценка; они могут устанавливать переменные, менять каталоги, открывать файлы... в общем-то,что-либооболочка может это сделать. И, что важно, они запускаются в контексте текущей оболочки. Когда вы запускаете, sudo myfunctionто ничего из этого невозможно; в частности, sudoкоманды запускаются как подпроцесс и поэтому не могут повлиять на текущую оболочку.

Обходной путь, используемый для вещей, подобных sudowrapупомянутым выше, заключается в попытке автоматически выработать sudo bash -c 'myfunction() {...} ; myfunction'. Это явно вызывает новую bashподоболочку, а затем запускает функцию в этой подоболочке. Явный вызов ясно дает понять, что такие вещи, как установка переменных и тому подобное, не будут работать :-) Это допускает ограниченное подмножество функциональности.

Вид функций, которые вы можете вызывать таким образом, может быть лучше переписать как скрипты оболочки, а не функции; тогда sudoвы можете вызывать их напрямую. Пример, приведенный наhttp://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlбыло бы проще преобразовать dukв исполняемый файл

#!/bin/bash
exec du -k "$@" | sort -n

Тогда все будет работать так, как и ожидалось!

Связанный контент