2012-04-05 56 views
5


通常我會在.bashrc中保存目錄特定設置,並且每當我更改目錄時都要執行命令source .bashrc以使這些設置生效。
現在我正在考慮在~/.bashrc中操作cd命令,因此每當我切換到新目錄時,如果有任何.bashrc存在,它將自動加載。定製cd命令

與此相似cd $1; source .bashrc(我已經驗證$ 1是有效路徑),但問題是cd是shell編譯,所以它是一個遞歸循環(cd始終指向修改後的cd)。我們沒有cd的elf文件(我們通常使用其他命令即scp或其他命令)。那麼我怎麼能做到這一點? 如果支持shopt -s cdspell,那麼我也需要在$ 1的參數中有cd拼寫路徑。

+0

爲什麼人們關閉它?這是複製到其他線程,我不這麼認爲。或者因爲擁有100K或900K聲譽的人無法獲得回答的機會? – peeyush 2012-04-07 05:37:34

回答

6

你想要「內建」命令;

內置殼內建[參數]

執行指定的外殼內置, 傳遞參數,並返回它的退出狀態。當 定義一個名稱與shell內部函數相同的函數時,此函數很有用, 保留了函數中內置函數的功能。通常用這種方法重新定義內建的內建函數(cd )。如果 shell-builtin不是shell內置命令,則返回狀態爲false。

來源:http://linux.die.net/man/1/bash

所以,你可以有這樣的事情(未經測試,沒有得心應手的bash其一);

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

cool :-)。 (爲什麼有15個字符限制?) – peeyush 2012-04-05 10:38:09

+1

您需要'-e'前面的'test'。 – l0b0 2012-04-05 11:05:18

+0

謝謝,修復它。 – 2012-04-05 11:06:39

0

你可以試試這個:

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

沒有測試這麼多,但是。

+0

問題是一樣的,遞歸調用這個cd的新定義。 – peeyush 2012-04-05 10:34:28

+0

我已經在以下版本中測試過它: function cdd(){ cd $ 1; if [-e ./.bashrc];然後回聲「嗨,那裏!」; fi } 別名cd ='cdd' 然後 提示符> cd 嗨,有 – begemotv2718 2012-04-05 10:40:23

1

RVM做到這一點:

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; 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並在成功時運行一些代碼,或者在失敗時返回退出代碼。

2

您可能會檢查出direnv。 https://github.com/zimbatm/direnv

+0

當我設計direnv時,其中一個具體目標是避免像RVM那樣覆蓋內置命令(做?)。相反,direnv依賴於bash中的PROMPT_COMMAND之類的shell鉤子來檢測目錄更改。 – zimbatm 2014-12-02 13:50:41