最近、次のようにカスタムエイリアスを有効にできることがわかりました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
その後、期待通りに動作します!