新しいディレクトリに入ったときに特定の bash 関数を実行したいと思います。次のように考えてください:
alias cd="cd $@ && myfunction"
$@
そこでは機能せず、バックスラッシュを追加しても役に立ちません。また、 cd をいじるのも少し心配です。ディレクトリを変更する他のコマンドでこれが機能するといいのですがpushd
、popd
.
より良いエイリアス/コマンドはありますか?
エイリアスはパラメーターを受け入れません。関数を使用する必要があります。プロンプトが発行されるたびに自動的に実行する必要はありません。
function cd () { builtin cd "$@" && myfunction; }
このbuiltin
キーワードを使用すると、再帰を作成せずに Bash ビルトインを再定義できます。パラメータを引用すると、ディレクトリ名にスペースが含まれている場合に機能します。
Bashのドキュメントには次のように書かれています。
ほとんどすべての目的で、シェル関数はエイリアスよりも優先されます。
私が思いつくことができる最も簡単な解決策はこれです
myfunction() {
if [ "$PWD" != "$MYOLDPWD" ]; then
MYOLDPWD="$PWD";
# strut yer stuff here..
fi
}
export PROMPT_COMMAND=myfunction
それでいいはずです。すべてのコマンドで機能し、プロンプトが表示される前にトリガーされます。
これには他にもいくつかのバージョンがあります。
これらはどちらも bash と zsh の両方をサポートしています
chpwd
プロジェクト固有のZSH構成を調達するために、コールバック関数を利用するZSHスクリプトを作成しました。Bashで動作するかどうかはわかりませんが、試してみる価値はあると思います。cdしているディレクトリにスクリプトファイルが見つからない場合は、ソースとなるスクリプトが見つかるまで(またはに達するまで/
)親ディレクトリをチェックします。またunmagic
、ディレクトリからcdアウトするときに関数を呼び出します。これにより、プロジェクトを終了するときに環境をクリーンアップできます。
http://github.com/jkramer/home/blob/master/.zsh/func/magic
「魔法の」スクリプトの例:
export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b
ctags -R --languages=Perl $PWD # update ctags file when entering the project directory
export PERL5LIB="$BASE/lib"
# function that starts the catalyst server
function srv {
perl $BASE/script/${PROJECT_NAME}_server.pl
}
# clean up
function unmagic {
unfunction src
unset PERL5LIB
}