特定のディレクトリに「cd」すると自動的にファイルをインポートする

特定のディレクトリに「cd」すると自動的にファイルをインポートする

私の要件に合わせて、すべてのディレクトリで十分に一般的ないくつかのユーティリティコマンドとエイリアスがあります。ただし、「build」などのカスタム動作が必要な特定のディレクトリがあります。

そのために、同じ名前の関数とエイリアスを変更して、このディレクトリに別のファイルを作成しました(新しい名前を覚えておく必要はありません)。

現在の特定のディレクトリにCDをコピーしたら、手動でファイルをインポートします。

source custom_aliases_n_fns

これはうまくいきますが、このファイルソースを自動化したいと思います。

ファイルソースを特定のディレクトリにCDに送信する方法はありますか?

注:システム全体のユーザーエイリアスを変更したくないので、このアプローチを使用しました。

答え1

現在の作業ディレクトリが変更されるたびに呼び出される特別なフック関数をzsh使用できます。chpwd

custom_aliases_n_fns_already_sourced=false
chpwd() {
  if
    ! $custom_aliases_n_fns_already_sourced &&
      [[ $PWD = /some/dir && -f custom_aliases_n_fns ]]
  then
    source ./custom_aliases_n_fns
    custom_aliases_n_fns_already_sourced=true
  fi
}

盲目的に文書を購入することはお勧めできませんどのディレクトリ(したがって確認$PWD = /some/dir)は乱用される可能性があります。

独自のフックを変更することに加えて、chpwd次のこともできます。

myhook() {
  if
    [[ $PWD = /some/dir && -f custom_aliases_n_fns ]]
  then
    source ./custom_aliases_n_fns
    chpwd_functions[(Ie)$0]=() # remove ourselves from the array
  fi
}
chpwd_functions+=(myhook)

これにより、現在の作業ディレクトリが変更されたときに複数のフック関数を呼び出すことができます。ここでは、ファイルをインポートしたかどうかを記録するのではなく、ファイルをインポートchpwdした後にフックリストから関数を削除します。

答え2

未テスト

ターゲットディレクトリに空白行または#commentsを含まないコマンドを.myaliases含むファイルがあります。alias foo=bar

あなたの~/.bashrc

function cd() {
if [[ -f ./.myaliases ]] ; then
  sed -e 's/^/un/;s/=.*$//' ./.myaliases >/tmp/myaliases.$$
  source /tmp/myaliases.$$
  rm /tmp/myaliases.$$
fi

builtin cd "$*"

if [[ .f ./.myaliases ]]; then
 source ./.myaliases
fi

まず、現在のディレクトリにファイルがあることを確認し.myaliases、その場合はそのファイルのエイリアスを解放して新しいディレクトリにきれいに移動できます。次に、ターゲットディレクトリに移動し、.myaliasesそこにファイルがあることを確認し、ファイルがある場合はファイルをインポートします。詳細を読んでくださいman bash

答え3

たぶんこのテンプレートのようなものがありますか?
.bashrcから:

PS1+='$([ \w = ~ ] && command || another command)'

環境変数$PWDとエスケープヒント\wシーケンスはすべて有効です。これはあなたが探しているものとかなり一致しますが、一般的に正しい方法がわかりません。

関連情報