명령 줄의 내장“cd”명령을 무시할 수 있습니까?


22

명령 줄 (bash)을 통해 내 컴퓨터의 다른 디렉토리 (이 경우 Mac OS X 10.6.7 실행)에 'cd'할 때마다 즉시 'ls'를 입력하여 내용 목록을 얻습니다. 그 디렉토리에. 요청한 디렉토리로 변경하여 한 번에 목록을 제공하도록 'cd'를 재정의하는 방법을 찾으려고합니다.

~ / .bash_profile에 다음 줄을 추가하여 작업하려는 기본 기능을 얻을 수있었습니다.

function cl() { cd "$@"; ls -l; }

이것은 예상대로 작동합니다. 요청한 디렉토리로 변경 한 후 내용을 표시합니다. 문제가 발생하면 새 "cl"명령을 만드는 대신 "cd"자체를 재정의하려고합니다.

다음 작동 하지 않습니다

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

또한 나열되지 않은 몇 가지 다른 반복을 시도하고 작동하는 'cl'기능을 가리키는 별칭을 만들었습니다. 어느 것도 효과가 없었습니다.

문서에서 읽은 내용은 'cd'를 외부 명령으로 실행할 수 없다는 사실에 대해 이야기합니다 (이 기능을 사용해야하는 방식으로 이해합니다).

따라서 현재 "cl"명령을 사용하여 원하는 것을 얻을 수 있지만 질문은 / 남아 있습니다.

'cd'의 동작을 재정 의하여 요청 된 디렉토리로 변경 한 후 나중에 다른 작업을 수행하는 방법이 있습니까?

답변:


30

다음이 작동합니다.

function cd() { builtin cd "$@" && ls -l; }

기능이 한 줄에 있기 때문에 ;제대로 작동하려면 위와 같이 종료 해야합니다.


매개 변수가없는 호출에는 작동하지 않습니다.
Daniel Beck

3
@DanielBeck-적어도 내 Mac OSX (10.6.7)에서는 매개 변수가없는 호출에서 제대로 작동합니다. 동작은 홈 디렉토리로 변경 한 다음 해당 디렉토리의 목록을 수행하는 것입니다. 끝에 추가 된 새로운 기능으로 일반 'cd'의 기능을 효과적으로 복제합니다.
Alan W. Smith

2
@ Alan True, 그 코드를 쉘에 임시로 작성하여 테스트했습니다. 그것은 cd ""(이 답변이 평가 해야하는 cd "$@"것과 공란 이 다른 것 같습니다 $@. 혼란에 대해 죄송합니다.
Daniel Beck

@DanielBeck-걱정 마세요.
Alan W. Smith

2
참고 : 질문에 대한 정확한 답변이므로 허용되는 답변으로 변경하고 있습니다. @RichHomolka가 작성한 것은 주체를 다루는 데 훌륭하지만 ~ / .bash_profile 파일에 넣을 수있는 것입니다.
Alan W. Smith

10

나는 당신이 루프에 빠져 있다고 생각합니다. 귀하의 cd기능을 호출 cd입니다 ... 기능.

builtin명령 검색이 함수가 아닌 cd와 같은 Bash 내장을 사용하게 만드는 키워드 에 대해 알아야 합니다.

function cd
{
    builtin cd "$1"
    : do something else
}

또한 /usr/bin/cd이러한 명령이 존재하더라도 호출 은 작동하지 않습니다.

무슨 일이 일어날 지:

  • 내 Bash 쉘은 dir에 /bash/dir있습니다.
  • 나는 명령을 실행합니다 /usr/bin/cd /dir/for/cd.
  • /usr/bin/cddir로갑니다 /dir/for/cd.
  • /usr/bin/cd 종료합니다.
  • /bash/dir하위 프로세스 /usr/bin/cd는 상위 프로세스에 영향을 줄 수 없기 때문에 Bash는 여전히에 있습니다.

또한 별칭은 간단한 텍스트 대체입니다. 그들은 매개 변수를 가질 수 없습니다.


나는 제안한다 builtin cd $@ && ls; 이후 cd호출이 모든 것을 성공해야 다른 의미가 있습니다. 또한 cd(논쟁 없음) 과 같은 특별한 경우를 기억하십시오 .
Daniel Beck

참고 :이 답변을 허용 된 답변으로 표시하려고했지만 6 분 더 기다려야한다는 것을 알 수 있습니다. 당신이 할 수 있기 전에 지연이 있음을 몰랐습니다.
Alan W. Smith

@Alan 또 다른 더 나은 솔루션은 매우 합리적인 기간 (즉, 몇 분 정도 기다려야 함)에 나타날 수 있습니다. 이것이 시스템 강제 지연이있는 이유입니다. 속도보다 품질을 선호해야합니다. 너무 불편하지 않아야합니다.
Daniel Beck

그리고 우리는 승자가 있습니다. 이것은 챔피언처럼 작동합니다. @DanielBeck에 따라 &&를 사용하도록 변경하고 다음과 같이 한 줄로 압축했습니다. function cd {builtin cd "$ @"&& ls -l; }
Alan W. Smith

@DanielBeck-예, 걱정하지 않습니다. 전에는 눈치 채지 못했습니다. 나는 그 논리를 볼 수 있습니다. 조금 놀랐습니다.
Alan W. Smith

6

'cd'기능을 가로채는 다른 스크립트 (예 : rvm)가 있으므로 CD를 무시하지 않는 것이 좋습니다. 대신 'd'와 같은 다른 이름을 선택하고 함수에 'builtin'유형을 지정하지 않는 것이 좋습니다. 그렇지 않으면 납치범이 작동하지 않습니다. 아래 코드를 사용하고 있습니다 :

function d() { cd "$@" && ls;} 

OP의 질문에 따르면 이것이 작동하지 않을 것이라고 생각했습니다.
user305964
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.