ロード可能なビルトインbashモジュールの配布
-
22-07-2019 - |
質問
ソフトウェアの要件である「cd」コマンドを変更するbashのビルトインを作成しました。 bash自体とは独立してロード可能オブジェクトを実際に配布する方法はありますか? 「追加機能」をドロップするだけで配布したいのが理想です。なぜなら、ソースコードからシェルにパッチを適用してコンパイルすることで、人々を先送りできるからです。
ユーザーがディレクトリにいる時間を計りたいので、どこに行きたいかを判断できます。この機能です: http://github.com/joelthelion/autojump/tree/masterパフォーマンスの問題のために、bashビルトインとして書き直されました。この実装では $ PROMPT_COMMAND
を使用して動作しますが、統合されたものが必要でした。
解決
変更内容は不明ですが、いずれにしても、 bash
(少なくともIIRCがコンセプトと zsh
を導入した ksh93
など) enable -f file name
構文を使用して、外部の動的にロードされるモジュールとして組み込み関数をロードすることをサポートします。
これらがプレーンファイルであるモジュールは、ターゲットバージョン/アーキテクチャと互換性があることを確認する限り、確実に独立して配布できます。これは、5年前にこの質問をしたときにすでに当てはまりました。
あなたの場合の1つの問題は、前者にアクセスする能力を維持しながら、動的にロードされたものによって cd
のような内部ビルトインをオーバーロードする文書化された方法がないように見えることです
簡単な回避策は、mycdなどの別の名前でカスタマイズしたcdを次のように実装することです。
int mycd_builtin(list)
WORD_LIST *list;
{
int rv;
rv=cd_builtin(list);
if(rv == EXECUTION_SUCCESS) {
char wd[PATH_MAX+1];
getcwd(wd,sizeof(wd));
// do your custom stuff knowing the new working directory
...
}
return (rv);
}
次に、エイリアスを使用するか、通常のバージョンの代わりに使用するカスタマイズされたバージョンのシェル関数を使用します:
cd() {
mycd "$@"
}
カスタマイズが標準コマンドの動作に影響を与えず、それを使用してスクリプトを壊すリスクがない限り、アプローチに問題はありません。
他のヒント
組み込みCDの変更は、管理者にとっては悪夢であり、外国人ユーザーにとっては歓迎されない悪夢です。 「smart-cd」という名前を付けて、ユーザーに.bashrcまたは.profileに含めることで機能を使用するかどうかを決定させることの何が問題になっていますか?その後、必要に応じて設定できます。
また、ディレクトリにいる時間の長さを使用することは、好みのかなり悪い指標です。アイドリング(忘れられたシェルが/ tmpに一晩ぶら下がっている)、長時間実行されているスクリプト(夜間のcronジョブ)、および実際のアクティビティをどのように区別しますか。
お気に入りのディレクトリへのショートカットを作成する方法は他にも多数あります:エイリアス、ソフトリンク、$ VARIABLES、スクリプト。使用パターンがシステムの他のユーザーに歓迎されると想定することはyou慢です。