Недавно я узнал, что можно включить 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
Тогда все будет работать так, как и ожидалось!