Bash 4.4 로컬 읽기 전용 배열 변수 범위: 버그?

Bash 4.4 로컬 읽기 전용 배열 변수 범위: 버그?

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

스크립트는 bash5.1 버전의 셸에서는 올바르게 실행되지만 4.3 이후의 중간 버전에서는 실행되지 않습니다.

이러한 버그는 아마도 버전 4.3 또는 4.4쯤에 도입되었을 것입니다. 두 버전을 개발하는 동안 읽기 전용 선언 및 변수 작동 방식에 몇 가지 변경이 이루어졌습니다.

변경 로그에는 문제의 버그 수정과 관련이 있을 수 있는 항목이 두 개 이상 있습니다.

  1. 의 경우 bash-5.0-alpha변경 로그할 말이 있어요( readonly내장 함수를 참조하는 것도 local -r영향을 받는다고 가정합니다):

readonly함수 내의 배열 및 스칼라 변수에 적용될 때 내장 함수가 다르게 동작할 수 있는 버그를 수정했습니다 .

  1. 의 경우 bash-5.1-alpha, 이와 관련될 수 있는 또 다른 오류또한 언급:

함수의 임시 환경에 나타나는 변수와 이름이 같은 로컬 변수가 로컬로 표시되지 않는 버그를 수정했습니다.


균등하게 사용쉘용 Git 저장소그리고 귀하의 스크립트에서 발생한 오류를 발견했습니다.bash-4.4-rc1, 그런 다음 고정bash-5.1-alpha. 둘 다 대규모 커밋이므로 코드의 특정 변경 사항을 지적하기가 어렵습니다.

관련 정보