bash 함수를 재정의하는 방법은 무엇입니까?


13

에서 bash쉘, 우리는 함수를 정의 할 수 있습니다 f와를

f(){ echo Hello; }

그런 다음 오류 또는 경고 메시지없이 다시 선언 / 재정의하십시오.

f(){ echo Bye; }

이런 식으로 함수가 재정의되는 것을 방지하는 방법이 있다고 생각합니다.


2
변수와 동일하며 typeset -r: typeset -rf f.
mosvy

3
또는readonly -f f
mosvy

답변:


25

넌 선언 할 수도 f이용한 읽기 전용 함수 readonly -f f또는 declare -g -r -f f( readonly동일하다 declare -g -r). 그것은이다 -f에 옵션이 내장 된 그들에 행동하게 유틸리티 f오히려 변수보다는, 함수의 이름으로 f.

$ f(){ echo Hello; }
$ readonly -f f
$ f(){ echo Bye; }
bash: f: readonly function
$ unset -f f
bash: unset: f: cannot unset: readonly function
$ f
Hello

보시다시피, 함수를 읽기 전용으로 설정하면 재정의를 방지 할뿐만 아니라 설정이 해제되지 않도록 (완전히 제거) 보호 할 수 있습니다.


현재 (현재 bash-5.0.11) 읽기 errexit옵션 함수를 수정하려고하면 쉘 옵션 ( set -e)을 사용하는 경우 쉘이 종료되지 않습니다 . 쳇의 bash메인테이너는, 이것이 감독이라고 말한다 그것은 다음 릴리스로 변경됩니다.


함수를 무시하려고하면 메시지 bash: f: readonly function와 0이 아닌 상태 코드가 생성되지만 errexit옵션이 활성화 된 경우 종료되지 않습니다 .
kyb

@ kyb 나는 이것도 알아 차렸다. 에 버그 가 있는지 확실 bash하지 않지만 bash메일 링리스트 중 하나에 요청할 것을 요청합니다 .
Kusalananda

이 동작에 대해 확신 할 수 있으면 답변을 업데이트하십시오.
kyb

1
@kyb Stephane Chazelas와 Greg Wooledge 모두 그 질문에 대해 설명할만한 설명을하였습니다. 스테판은 그 제안 bash경우에만 종료 set -ePOSIX 때 적용되는 요구 에 (그리고 readonly -fPOSIX되지 않습니다). Greg bash는 함수 선언 errexit이 종료를 트리거하는 이유로 "함수 선언 실패"를 언급하지 않는다고 지적합니다 (함수 선언이 복합 명령으로 계산되지 않으면 확실하지 않습니다). 스레드는 현재 진행 중입니다 : lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
Kusalananda

@kyb 나는 또한 당신에 대해 아무것도 말하지 않을 것을 알았어 야 errexit또는 set -e당신의 문제를.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.