5


通常、私はディレクトリ固有の設定を保持し、ディレクトリ.bashrcを変更するたびにコマンドsource .bashrcを実行して、それらの設定を有効にします。
今、私はでcdコマンドを操作することを考えて~/.bashrcいたので、新しいディレクトリにcdするたびに、そこに.bashrcが存在する場合は、自動的にロードされます。

これと同様cd $1; source .bashrcです($ 1が有効なパスであることを確認しました)が、問題はcdがシェル構築であるため、再帰ループです(cdは常に変更されたcdを指します)。cdのelfファイルはありません(通常、他のコマンド、つまりscpなどがあります)。では、どうすればこれを達成できますか?また、shopt -s cdspellサポートされている場合は、$1の引数にcdスペルトパスが必要です。

4

4 に答える 4

6

「組み込み」コマンドが必要です。

ビルトイン シェルビルトイン [引数]

指定されたシェル ビルトインを実行し、引数を渡し、終了ステータスを返します。これは、シェル組み込み関数と同じ名前の関数を定義し、関数内で組み込み関数の機能を保持する場合に便利です。cd ビルトインは、通常、このように再定義されます。shell-builtin がシェル組み込みコマンドでない場合、戻りステータスは false です。

から: http://linux.die.net/man/1/bash

したがって、次のようなものを使用できます (テストされていません。bash も手元にありません);

function cd() {
    builtin cd $1 \
        && test -e .bashrc \
        && source .bashrc
}
于 2012-04-05T10:32:00.717 に答える
2

direnv をチェックしてみてください。https://github.com/zimbatm/direnv

于 2012-04-05T15:46:48.767 に答える
1

RVMはこれを行います:

$ type cd
cd is a function
cd () 
{ 
    if builtin cd "$@"; then
        [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true;
        __rvm_do_with_env_before;
        __rvm_project_rvmrc;
        __rvm_after_cd;
        __rvm_do_with_env_after;
        return 0;
    else
        return $?;
    fi
}

はい、これは私のマシンで動作します。基本的に、@ RoryHunterが言ったbuiltinように、成功した場合はコードを使用して実行し、失敗した場合は終了コードを返します。

于 2012-04-05T11:03:58.800 に答える
0

これを試すことができます:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; }
alias cd = 'cdd' 
?

ただし、これほど多くはテストしませんでした。

于 2012-04-05T10:31:07.087 に答える