最近我了解到您可以啟用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
然後就會照預期工作!