Вместо TIMESTAMP
, поместить
$$(date +%Y%m%d%H%M%S)
в Вашем рецепте остроты.
В общем случае то, что вы пытаетесь сделать, на самом деле не работает.
В случае псевдонимов, перед передачей строки на выполнение выполняется простая перезапись строки.
Так, например, если у вас есть
alias sudo='sudo '
alias foo='bar baz'
, то при вводе sudo foo
командная строка переписывается на sudo bar baz
и , что является то что запускается. Это простое переписывание командной строки.
Теперь функции усложнились. Это не просто переписывание, а полная оценка; они могут устанавливать переменные, изменять каталоги, открывать файлы ... в значительной степени делать все, оболочка. И, что немаловажно, они запускаются в контексте текущей оболочки. Когда вы запускаете sudo myfunction
, ничего из этого невозможно; в частности, команды sudo
выполняются как подпроцесс и поэтому не могут влиять на текущую оболочку.
Обход, используемый для таких вещей, как sudowrap
, упомянутый выше, заключается в том, чтобы попытаться автоматически обработать sudo bash -c 'myfunction () {...}; моя функция »
. Это явно вызывает новую подоболочку bash
, а затем запускает функцию в этой подоболочке. Явный вызов дает понять, что такие вещи, как установка переменных и тому подобное, работать не будут :-) Он позволяет использовать ограниченный набор функций.
Функции, которые вы можете вызывать таким образом, лучше переписать как сценарии оболочки, а не функции; тогда sudo
может вызвать их напрямую. Пример, приведенный на http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.html , будет проще, если duk
преобразовать в исполняемый файл
#!/bin/bash
exec du -k "$@" | sort -n
Тогда он будет работать, как ожидалось!