bash 기능을 덮어쓰지 않도록 보호하는 방법은 무엇입니까? 읽기 전용으로 설정

bash 기능을 덮어쓰지 않도록 보호하는 방법은 무엇입니까? 읽기 전용으로 설정

bash쉘 에서는 f함수 를 정의할 수 있습니다.

f(){ echo Hello; }

그런 다음 오류나 경고 메시지 없이 다시 선언/재정의합니다.

f(){ echo Bye; }

나는 이런 식으로 함수가 재정의되지 않도록 보호하는 방법이 있다고 믿습니다.

답변1

또는 (동일)을 사용하여 함수를 foo읽기 전용으로 선언할 수 있습니다. 이러한 내장 유틸리티에 대한 옵션을 사용하면 해당 유틸리티가 변수가 아닌 함수 이름으로 작동합니다.readonly -f foodeclare -g -r -f fooreadonlydeclare -g -r-ffoofoo

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

보시다시피, 함수를 읽기 전용으로 만들면 덮어쓰는 것을 방지할 수 있을 뿐만 아니라 설정 해제(완전히 제거)도 방지할 수 있습니다.


현재(현재) bash-5.0.11쉘 옵션( )을 사용하는 경우 읽기 전용 기능을 수정하려고 해도 쉘이 종료되지 않습니다. 쳇, 관리자,errexitset -ebash실수였다고 하더군요그리고 다음 버전에서는 변경될 예정입니다.

업데이트: 이 문제는 2019년 10월에 해결되었으므로 bash-5.1-alpha셸 옵션이 활성화된 동안 읽기 전용 기능을 수정하려고 하면 5.1 이상 버전이 올바르게 종료됩니다.basherrexit

답변2

@Kusalananda의 답변에 댓글이 없습니다. Bash 관리자에 따르면 .bashrc를 사용할 때 읽기 전용 기능을 변경하면 쉘이 종료됩니다 set -e.

Ubuntu 20.10 및 최신 bash 버전을 사용하고 있습니다. 아쉽게도 깨진 것 같습니다.

$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

테스트 파일

#!/usr/bin/env bash

set -e

test() {
    echo "I'm test() function"
}
readonly -f test

test

test() { # should exit here
    echo "I'm test() function (duplicated)"
}
test

산출

$ chmod +x test.sh; ./test.sh
I'm test() function
./test.sh: line 14: test: readonly function
I'm test() function

최신 bash 버전을 사용하여 docker 컨테이너 내에서 이 스크립트를 테스트했는데 예상대로 작동합니다.

GNU bash, version 5.1.8(1)-release (x86_64-pc-linux-musl)

관련 정보