カスタム関数で `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.htmlduk実行可能ファイルに変換することで簡単になります

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

そうすれば期待通りに動作するはずです!

関連情報