내장 쉘을 명시 적으로 호출하는 방법은 무엇입니까?


13

cd필요에 따라 명령 기능을 사용자 정의하고 싶습니다 .

나는 다음 기능을 정의했다- function cd () { cd "$@" && pushd "$@"; }

이 기능의 목적은 디렉토리를 스택에 자동으로 푸시하여 pushd .매번 수동으로 입력하는 노력을 줄여줍니다 .

그러나 위의 함수는 내장 cd함수가 아닌 함수 자체로 해석 되므로 무한 재귀 함수 cd입니다.

cd이 함수에서 내장을 어떻게 참조 합니까?

를 사용하여 별칭을 이스케이프 할 수 있다는 것을 알고 있습니다 \. 보다 명시적인 방식으로 함수를 피하거나 내장을 참조하는 방법은 무엇입니까?

참고 : 함수 이름을 다른 것으로 바꾸고 싶지 않습니다.


3
왜 안돼 alias cd=pushd? 절대 경로가 아닌 다른 경로 (예 :)로 CD를 넣을 때 어떤 일이 발생 cd ../합니까?
Patrick

@Patrick pushd은 지원하지 않습니다 -P. 그러나 질문에 표시된 function cd것처럼 디렉토리가 두 번 변경되었으므로 약간 잘못 보입니다.
Tino

답변:


5

command내장 기능은 명령 이름 이 내장 또는 외부 명령으로 해석되도록합니다 (별명 및 기능 조회 생략). bash를 포함한 모든 POSIX 쉘에서 사용 가능합니다.

cd () { command cd "$@" && pushd "$@"; }

(이 예제는 나쁜 예입니다. 상대 경로에서는 작동하지 않으므로 pushd처음부터 입력 하면됩니다.)

bash 및 zsh (ksh는 아님)에서 builtin명령 이름을 별명, 함수 및 외부 명령을 제외하고 내장으로 해석하도록 할 수 있습니다 .


15

Bash에는 (기본 제공) 명령이 builtin있으며, 필요한 것을 정확하게 수행합니다. 교체 cdbuiltin cd함수에서하면 재귀가 해결됩니다.


1

"함수의 이름을 다른 것으로 바꾸고 싶지 않다"고 말하면 원래 명령과 같은 이름으로 함수를 호출 할 수 있다는 의미입니다.

따라서 내장되지 않은 것들에 대해서도 작동하는 또 다른 방법은 함수의 이름을 다른 것으로 지정한 다음 랩핑 된 명령의 별명을 정의하는 것입니다. 이것은 함수의 실행 컨텍스트에 별칭이 없기 때문에 작동합니다.

예제 wrapper.sh :

#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }

그리고 예를 들어 .bash_aliases :

source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"

그러나 이것은 꽤 해키입니다. 가능하면 사용하는 command것이 좋습니다.


-1

이것이 상대 경로와 함께 작동하려면 다음이 필요합니다.

function cd { 
   dir="$(realpath "$@")"
   command cd "$dir"
   pushd "$dir"
}

이것은 당신이 'realpath'유틸리티를 포함하는 충분히 현대적인 리눅스 배포판에 있다고 가정합니다. (예를 들어 RHEL 6은 그렇지 않습니다). Perl이 사용 가능한 경우 다음을 사용하여 'realpath'를 시뮬레이션 할 수 있습니다.

! realpath $(pwd) > /dev/null 2>&1  && function realpath {
    perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.