22

新しいディレクトリに入ったときに特定の bash 関数を実行したいと思います。次のように考えてください:

alias cd="cd $@ && myfunction"

$@そこでは機能せず、バックスラッシュを追加しても役に立ちません。また、 cd をいじるのも少し心配です。ディレクトリを変更する他のコマンドでこれが機能するといいのですがpushdpopd.

より良いエイリアス/コマンドはありますか?

4

4 に答える 4

24

エイリアスはパラメーターを受け入れません。関数を使用する必要があります。プロンプトが発行されるたびに自動的に実行する必要はありません。

function cd () { builtin cd "$@" && myfunction; }

このbuiltinキーワードを使用すると、再帰を作成せずに Bash ビルトインを再定義できます。パラメータを引用すると、ディレクトリ名にスペースが含まれている場合に機能します。

Bashのドキュメントには次のように書かれています。

ほとんどすべての目的で、シェル関数はエイリアスよりも優先されます。

于 2010-07-29T15:09:34.553 に答える
20

私が思いつくことができる最も簡単な解決策はこれです

myfunction() {
  if [ "$PWD" != "$MYOLDPWD" ]; then
    MYOLDPWD="$PWD";
    # strut yer stuff here..
  fi
}

export PROMPT_COMMAND=myfunction

それでいいはずです。すべてのコマンドで機能し、プロンプトが表示される前にトリガーされます。

于 2010-07-29T08:54:48.340 に答える
8

これには他にもいくつかのバージョンがあります。

  • 私が書いたsmartcdには、テンプレート化や一時的な変数の保存など、たくさんの機能があります
  • ondir、これはより小さく、はるかに単純です

これらはどちらも bash と zsh の両方をサポートしています

于 2012-01-01T01:37:23.277 に答える
2

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
}
于 2010-07-29T10:18:43.093 に答える