![명령과 무한 재귀를 끄는 플래그](https://linux55.com/image/128831/%EB%AA%85%EB%A0%B9%EA%B3%BC%20%EB%AC%B4%ED%95%9C%20%EC%9E%AC%EA%B7%80%EB%A5%BC%20%EB%81%84%EB%8A%94%20%ED%94%8C%EB%9E%98%EA%B7%B8.png)
여러 터미널에서 사용할 때 내 기록을 덮어쓰므로 해당 기능을 끄고 싶습니다 fc -W
. 불행히도 나는 타이핑을 많이 하는 습관이 있다.
별칭을 만드는 것이 불가능하다고 생각합니다 fc -W
.
그래서 다음과 같은 함수를 만들어 보았습니다.
# Make sure to never invoke fc -W
fc(){
for x; do
if [[ "${x}" == -W ]]; then
echo "I'm sorry Dave. I'm afraid I can't do that."
return
fi
done
fc "${@}"
}
그러나 이제 호출이 fc "${@}"
자체적으로 호출되고 무한 재귀가 발생합니다. 일반적으로 나는 /usr/bin/fc
대신 eg를 사용하여 이것을 피할 것입니다 . fc
그러나:
$ type fc
> fc is a shell builtin
이 경우 무한 재귀를 피하는 방법은 무엇입니까? 아니면 명령에 대한 플래그를 비활성화하는 더 좋은 방법이 있습니까?
답변1
사용 builtin
:
builtin fc "$@"
이렇게 하면 내장 fc
명령이 호출됩니다.
스타일: 진단 메시지는 표준 오류 스트림으로 전송되어야 하며, 함수는 실패 시 0이 아닌 상태를 반환해야 합니다.
echo 'Sorry, can not do that' >&2
return 1
답변2
별칭을 사용하여 내장 명령이나 외부 명령 또는 함수를 재정의할 수 있습니다. 동일한 이름을 가진 별칭은 별칭 실행 시 확장되지 않습니다. 따라서 별칭 확장에서 별칭 이름을 사용하는 경우 동일한 이름의 내장 또는 외부 명령이나 함수가 호출됩니다. 이는 간단한 방법으로 별칭을 사용하여 명령에 추가 옵션을 전달할 수 있음을 의미합니다. 그러나 별칭 확장이 작동하는 방식으로 인해 더 많은 작업을 수행할 수 없습니다. 단순한 단어 교체일 뿐이며 평가가 필요하지 않습니다.
함수를 사용하여 내장 명령이나 외부 명령을 재정의할 수 있습니다. 특정 이름의 함수가 현재 실행되고 있다는 사실은 실행에 영향을 미치지 않으며 특히 함수 이름의 의미에 영향을 미치지 않습니다. 항상 해당 함수를 참조합니다. 재귀 함수는 쉘 프로그래밍에서 흔하지 않지만 이에 대한 규칙은 없습니다.
command
POSIX 셸에서는 호출 앞에 이름을 지정하여 내장 또는 외부 명령을 강제로 인용할 수 있습니다. 즉, command
별칭과 함수를 우회합니다. zsh에서는 command
외부 명령 호출이 강제로 수행됩니다( posix_builtins
이 옵션이 설정되지 않은 경우). 즉, 내장 명령도 무시합니다. zsh에서 내장 함수를 강제로 실행하려면 builtin
내장 함수를 사용하세요.
이는 해결책으로 이어집니다. 래퍼 함수에서 builtin fc
대신 호출하세요 fc
.
fc
그러나 이것이 반드시 상황에 가장 적합한 솔루션은 아닙니다. 다른 함수의 호출을 포함하여 함수가 모든 곳에서 호출되기 때문입니다 . 기본 제공 동작을 재정의하는 경우 별칭을 사용하는 것이 좋습니다. 별칭은 로드된 함수 (함수 자동 로드에 권장되는 방법)가 아닌 명령줄에 입력하거나 로드하는 항목 .
(일명 )에만 적용됩니다. 따라서 래퍼 함수를 호출하는 별칭을 정의하고 래퍼 함수에 다른 이름을 지정하세요.source
autoload -U
fc
fc_wrapper () {
for x; do
if [[ "${x}" == -*W* ]]; then
echo >&2 "I'm sorry Dave. I'm afraid I can't do that."
return 1
fi
done
\fc "${@}"
}
alias fc=fc_wrapper
함수 정의에 \fc
대체를 넣었습니다 . fc
별칭 정의 이전에 정의를 로드할 때는 필요하지 않지만 .zshrc
, 예를 들어 대화형 세션 중에 함수 정의를 편집하거나 다시 로드하는 경우에는 필요합니다. 또한 기능을 약간 개선했습니다.
- 오류 메시지를 표준 오류로 인쇄합니다.
- 작업을 완료하지 않은 경우 오류 상태를 반환합니다.
- 이런 사건도 적발됐다
fc -WI
.fc -R -- -W
(read History from file names) 와 같은 호출 도 포착하므로 완전히 신뢰할 수는 없지만-W
이 사용 사례에는 충분합니다.