最近我了解到您可以启用sudo
自定义别名,如下所示:
alias sudo='sudo ' # note: the space is required!
这有效的原因如下:
如果别名值的最后一个字符是空格或制表符,则还会检查别名后面的下一个命令字是否有别名扩展。
我的问题是:有没有办法sudo
也启用自定义功能?
答案1
在一般情况下,您尝试做的事情并没有真正起作用。
对于别名,在传递执行行之前几乎只需重写字符串即可。
因此,举例来说,如果您有
alias sudo='sudo '
alias foo='bar baz'
然后当您输入sudo foo
命令行时被重写sudo bar baz
为那然后就是运行的内容。这是简单的命令行重写。
现在功能更难了。它们不是简单的重写,而是完整的评估;他们可以设置变量、更改目录、打开文件......几乎可以做任何事物外壳就可以做到。而且,重要的是,它们在当前 shell 的上下文中运行。当你跑步时sudo myfunction
,这一切都是不可能的;特别是sudo
命令作为子进程运行,因此不会影响当前 shell。
用于解决上述问题的解决方法sudowrap
是尝试自动计算sudo bash -c 'myfunction() {...} ; myfunction'
。这显式调用一个新的bash
子 shell,然后在该子 shell 中运行该函数。显式调用清楚地表明,设置变量之类的事情将不起作用:-)它允许功能的有限子集。
您可以通过这种方式调用的函数类型可能会更好地重写为 shell 脚本而不是函数;然后sudo
就可以直接打电话给他们了。给出的例子在http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlduk
转换为可执行文件会更容易
#!/bin/bash
exec du -k "$@" | sort -n
然后就会按预期工作!