명령 줄의 내장“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.