2012-05-18 7 views
0

저는 파일을 저장할 디렉토리에 "cd"하는 것이 편리하다고 생각합니다.bash에서 "cd"를 사용자 정의하십시오.

[[email protected] /]$ cd /usr/bin/somefile.pl 

공식적인 "cd"명령은 작동하지 않는다는 것을 알고 있습니다.

그래서는 다음과 같이 썼다 :

main() { 
    if [[ "${1}" =~ "(.+/)*(.*){1}" ]] && [ -f "${1}" ] ; then 
      `\cd ${1%/*}` 
    elif [ -f "${1}" ] ; then 
      exit 0 
    else ; `\cd ${1}` 
    fi 
} 
main ${1} 

을하고 나는 "CD"명령이 cd.sh 별칭 :

alias cd='source /somepath/cd.sh' 

을이 작동하지 않습니다.

\cd xxx 대신 eval "\cd xxx"을 사용하려고했습니다.

스크립트를 어떻게 수정합니까?

+0

야, 이건 좋은 생각이야. 그러나'basename'을 사용하여 정규 표현식이 아닌 경로를 조작하십시오. –

+0

언젠가 나는 단지 파일이 내가 그 파일의 절대 경로를 알고있을 때 나는 롤을보고있는 파일과 함께 저장하고 있는지보고 싶어하기 때문에. –

답변

3

그것은 cd을 무시하는 나쁜 생각 같은 느낌, 그래서 약간 다른 명령을 제안 할 것이다, fcd :

fcd() { cd -- "$(dirname -- "$1")"; } 

$ fcd /usr/bin/somefile.pl 
$ pwd 
/usr/bin 

또는 전화를 저장하는 매개 변수 확장을 사용하여 dirname에 :

fcd { cd -- "${1%/*}"; } 
+0

감사합니다! 나는 dirname을 사용하여 dir 이름을 얻을 수 있다는 것을 몰랐다 ... –

+0

그는 실제로'cd'를 재정의하지 않았다. – KurzedMetal

+0

+1 : fcd() {cd "$ (dirname"$ 1 ")"; }'디렉토리 이름에 공백이있는 경우. –

0
cd() { 
    DN="$(dirname "$1")" 
    if [[ -d "$1" ]]; then 
     builtin cd "$1" 
    elif [[ -d "$DN" ]]; then 
     builtin cd "$DN" 
    else 
     echo "$* or $DN: No such directories" 
     return 1 
    fi 
    return 0 
} 
+0

왜 "$ *"'입니까? 거기에 여러 개의 명령 줄 인수를 복용하고'$ IFS'의 첫 문자가 하나로 섞여서 흩어져있는 경우가 있습니까? –

+1

또한, $ (dirname "$ foo") 호출을 매개 변수 확장으로 바꾸는 것을 고려하십시오. ' "$ {foo %/*}"'- 이것은 서브 쉘을 필요로하지 않으므로 더 나은 성능을 보입니다. –

+0

@CharlesDuffy 실제'cd'는 모든 매개 변수를 하나로 간주하므로 누가 신경 써야합니다. 'cd one two'(따옴표 제외)를 쓰려면'cd '가'one two' (공백으로)로 cd하려고 시도 할 것입니다. – KurzedMetal

관련 문제