私の要件に合わせて、すべてのディレクトリで十分に一般的ないくつかのユーティリティコマンドとエイリアスがあります。ただし、「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
シーケンスはすべて有効です。これはあなたが探しているものとかなり一致しますが、一般的に正しい方法がわかりません。