cd
필요에 따라 명령의 기능을 사용자 정의 하고 싶습니다 .
나는 다음 함수를 정의했습니다 -
function cd () { cd "$@" && pushd "$@"; }
이 기능의 목적은 디렉토리를 스택에 자동으로 푸시하는 것입니다. 이를 통해 pushd .
매번 수동으로 입력해야 하는 수고를 덜 수 있습니다.
그러나 위 함수는 호출이 내장 함수 cd
가 아닌 함수 자체로 해석되기 때문에 무한 재귀 함수입니다.cd
cd
이 함수에 내장된 함수를 어떻게 참조할 수 있나요 ?
를 사용하여 별칭을 이스케이프할 수 있다는 것을 알고 있습니다 \
. 보다 명시적인 방법으로 함수를 이스케이프하거나 내장 함수를 참조하는 방법은 무엇입니까?
참고: 함수 이름을 다른 이름으로 바꾸고 싶지 않습니다.
답변1
builtin
Bash에는 필요한 작업을 정확하게 수행하는 (내장) 명령이 있습니다 . 함수 내에서 교체하면 재귀가 수정 cd
됩니다 .builtin cd
답변2
이것command
내장 명령은 명령 이름을 내장 또는 외부 명령으로 해석합니다(별칭 및 함수 조회 건너뛰기). bash를 포함한 모든 POSIX 쉘에서 작동합니다.
cd () { command cd "$@" && pushd "$@"; }
(이 예는 나쁜 예입니다. 상대 경로에서는 작동하지 않으므로 먼저 입력하는 것이 좋습니다 pushd
.)
bash 및 zsh(ksh는 아님)에서는 builtin
force를 사용하여 명령 이름을 별칭, 함수 및 외부 명령을 제외한 내장 명령으로 해석할 수 있습니다.
답변3
"함수 이름을 다른 이름으로 바꾸고 싶지 않습니다"라고 말하는 것은 원래 명령과 동일한 이름으로 함수를 호출할 수 있기를 원한다는 뜻인 것 같습니다.
따라서 내장되지 않은 항목에도 작동하는 또 다른 접근 방식은 함수에 다른 이름을 지정한 다음 래핑된 명령에 대한 별칭을 정의하는 것입니다. 이는 함수의 실행 컨텍스트에 별칭이 존재하지 않기 때문에 작동합니다.
래퍼.sh 예:
#!/bin/bash
function my_wrapper() { wrapped_program $@ && dostuff }
예를 들어, .bash_aliases에서는 다음과 같습니다.
source /path/to/wrapper.sh
alias wrapped_program="my_wrapper"
그러나 이것은 꽤 진부한 표현이다. command
가능하면 사용하는 것이 가장 좋습니다.
답변4
상대 경로를 사용하려면 다음이 필요합니다.
function cd {
dir="$(realpath "$@")"
command cd "$dir"
pushd "$dir"
}
이는 "realpath" 유틸리티를 포함할 만큼 충분히 현대적인 Linux 배포판을 사용하고 있다고 가정합니다. (예를 들어 RHEL 6의 경우는 그렇지 않습니다.) Perl을 사용할 수 있는 경우 다음을 사용하여 "realpath"를 시뮬레이션할 수 있습니다.
! realpath $(pwd) > /dev/null 2>&1 && function realpath {
perl -e "use Cwd realpath; print realpath(\"$1\") . \"\\n\";"
}