2012-04-05 4 views
5


일반적으로 디렉토리 특정 설정은 .bashrc에 있으며 디렉토리를 변경할 때마다 해당 설정을 적용하기 위해 source .bashrc 명령을 실행하십시오.
이제 ~/.bashrc에서 cd ​​명령을 조작하려고 생각했기 때문에 새로운 디렉토리로 이동하고 거기에 .bashrc가 있으면 자동으로로드됩니다.cd 명령 사용자 정의

cd $1; source .bashrc ($ 1이 유효한 경로임이 확인되었습니다.)하지만 cd는 쉘 쌓기이므로 재귀 루프입니다 (cd는 항상 modifed cd를 가리 킵니다). 우리는 elf 파일 (일반적으로 우리는 scp 나 다른 것들과 다른 명령들)을 가지고 있지 않습니다. 어떻게 이것을 할 수 있습니까? 또한 shopt -s cdspell이 지원되는 경우 $ 1 인수에서 cd ​​철자가 있어야합니다.

+0

왜 사람들이 그것을 닫고 있습니까? 이 것은 다른 스레드와 중복 된 것인가, 나는 그렇게 생각하지 않는다. 또는 100K 또는 900K 명성을 가진 사람들이 답변을 얻을 수 없었기 때문에? – peeyush

답변

6

"내장"명령을 원합니다.

내장 쉘 내장 [인수]

그것을 인수를 전달 , 지정된 쉘 내장을 실행하고 종료 상태를 반환합니다. 이것은 쉘 내장 함수와 이름이 같은 함수를 정의 할 때 유용하며, 은 함수 내에서 내장 함수의 기능을 유지합니다. CD 내장형은 일반적으로이 방법으로 재정의됩니다. 쉘 내장 명령이 쉘 내장 명령이 아닌 경우 반환 상태는 false입니다.

에서 : 그래서 http://linux.die.net/man/1/bash

, 당신은 (테스트되지 않은 어느 편리 떠들썩한이없는) 같은 것을 가질 수있다;

$ 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 
} 

을 그리고 네, 이것은 내 컴퓨터에서 작동합니다

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

cool :-). (15 자로 제한되는 이유는 무엇입니까?) – peeyush

+1

'-e' 앞에'test'가 필요합니다. – l0b0

+0

고마워, 고쳐. –

0

이 작업을 시도 할 수 :

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

그러나,이 정도를 테스트하지 않았다.

+0

문제는이 새로운 cd 정의에 대한 재귀 호출과 동일합니다. – peeyush

+0

이 변형은 다음 변형에서 테스트되었습니다. function cdd() { cd $ 1; [-e ./bashrc]; then echo "안녕, 거기!"; fi } 별칭 cd = 'cdd' 프롬프트> cd 안녕하세요, – begemotv2718

1

RVM이 작업을 수행합니다. 본질적으로 @RoryHunter가 말한 것처럼 builtin을 사용하고 성공하면 코드를 실행하거나 실패 할 경우 종료 코드를 반환합니다.

2

direnv를 확인해보십시오. https://github.com/zimbatm/direnv

+0

direnv를 설계했을 때의 구체적인 목표 중 하나는 RVM이 내장 명령을 재정의하는 것을 피하는 것이 었습니다 (그렇습니까?). 대신 direnv는 디렉토리 변경을 감지하는 bash의 PROMPT_COMMAND와 같은 쉘 훅에 의존합니다. – zimbatm

관련 문제