bash 4.4.20(1)을 사용하여 실행할 때 다음 스크립트가 실패합니다.
#!/bin/bash
bar() {
local args=("y")
}
foo() {
local -r args=("x")
bar
}
foo
오류가 있지만 line 3: args: readonly variable
읽은 후에 bash 4.2.46(2)를 사용하여 성공적으로 실행하는 것이 의미가 있습니다.24.2. 지역변수.
배열이 아닌 변수를 사용하는 다음 스크립트는 문제 없이 실행됩니다.
#!/bin/bash
bar() {
local args="y"
}
foo() {
local -r args="x"
bar
}
foo
아무것도 찾을 수 없어요다양성이는 bash 4.2.46(2)과 bash 4.4.20(1)의 차이점을 설명합니다.
질문: 이것은 bash 4.4.20(1)의 버그인가요? 이것이 예상된 동작이라면 왜 두 번째 스크립트가 실패하지 않습니까?
답변1
스크립트는 bash
5.1 버전의 셸에서는 올바르게 실행되지만 4.3 이후의 중간 버전에서는 실행되지 않습니다.
이러한 버그는 아마도 버전 4.3 또는 4.4쯤에 도입되었을 것입니다. 두 버전을 개발하는 동안 읽기 전용 선언 및 변수 작동 방식에 몇 가지 변경이 이루어졌습니다.
변경 로그에는 문제의 버그 수정과 관련이 있을 수 있는 항목이 두 개 이상 있습니다.
- 의 경우
bash-5.0-alpha
변경 로그할 말이 있어요(readonly
내장 함수를 참조하는 것도local -r
영향을 받는다고 가정합니다):
readonly
함수 내의 배열 및 스칼라 변수에 적용될 때 내장 함수가 다르게 동작할 수 있는 버그를 수정했습니다 .
- 의 경우
bash-5.1-alpha
, 이와 관련될 수 있는 또 다른 오류또한 언급:
함수의 임시 환경에 나타나는 변수와 이름이 같은 로컬 변수가 로컬로 표시되지 않는 버그를 수정했습니다.
균등하게 사용쉘용 Git 저장소그리고 귀하의 스크립트에서 발생한 오류를 발견했습니다.bash-4.4-rc1
, 그런 다음 고정bash-5.1-alpha
. 둘 다 대규모 커밋이므로 코드의 특정 변경 사항을 지적하기가 어렵습니다.