Bash에 버그가 있을 수 있나요? : foo() { echo "${var[0]}" };

Bash에 버그가 있을 수 있나요? : foo() { echo "${var[0]}" };

운영 체제: 우분투 16.04.3

껍데기:쿵쿵 4.3.48


나는 에 표시된 것처럼 변수의 내용을 일시적으로 변경하는 것이 가능하다는 것을 알고 있는데 var=value command, 이는 아마도 IFS= read -r var가장 주목할만한 경우일 것입니다.

그리고,위키를 제공해 주신 Greg에게 감사드립니다.,나는 또한 다음을 이해했습니다.

# Why this
foo() { echo "$var"; }
var=value foo

# And this does work
var=value; echo "$var"

# But this doesn't
var=value echo "$var"

내가 이해할 수 없는 것은:

$ foo() { echo "${var[0]}"; }
$ var=(bar baz) foo
(bar baz)

내가 아는 한(그리고 이전 예제의 논리에 따르면) bar대신 에 를 인쇄해야 합니다 (bar baz).

이런 일이 나에게만 일어나는 걸까요? 이것이 예상되는 동작입니까? 내가 놓친 게 무엇입니까? 아니면 버그인가요?

답변1

일반 통화:

var=value cmd

cmd이식 불가능한 기능입니다 .

의 경우 bash이는 스칼라 변수에 대해서만 작동합니다( x=(...)배열로 확인되지만 스칼라에 할당). 이렇게 하면 범위 지정과 관련된 많은 문제가 있습니다. ksh93및 의 yash경우 작동하지만 변수 정의는 그대로 유지됩니다. 을 사용하면 mksh구문 오류가 발생합니다. Bourne 쉘에서는 스칼라 변수에 대해서도 전혀 작동하지 않습니다.

또한 스칼라 변수를 사용하더라도 변수가 결국에는출구함수 내(즉, 실행 중인 명령에 전달됨)는 쉘마다 다릅니다(bash, yash, mksh, zsh에서는 다르지만 ksh, ash에서는 그렇지 않음).

그것은 당신이 기대하는 방식으로만 작동합니다 zsh. 배열 인덱싱 은 zsh1부터 시작됩니다.

bash-4.4$ zsh
$ a=(before value)
$ f() echo $a[1]
$ a=(temp value) f
temp
$ echo $a[1]
before

답변2

이는 단순한 버그가 아니며 구현되지 않은 기능인 것으로 보이며 구현할 계획도 없습니다. 이것메일링 리스트 게시물2014년부터 제작자는 다음 정보를 제공했습니다.

다행히 bash 4.3(패치 레벨 25)에서는 -DARRAY_EXPORT를 사용하고 배열 변수를 가져오거나 내보낼 수 없습니다. 코드가 컴파일되지 않고, 수정하면 링크되지 않으며, 수정하면 다음 문제가 발생하게 됩니다.

그렇게 하는 것만으로도 많은 어려움을 겪게 됩니다. 어레이 내보내기를 활성화할 계획이 없습니다.

Bash용 최신 git 저장소에서 콘텐츠를 추출하는 방법은 다음과 같습니다 variables.c.

  #  if ARRAY_EXPORT
        /* Array variables may not yet be exported. */

모든 것이 불완전하다는 것을 보여줍니다.

답변3

man bashBUGS 섹션 에서 (버전은 bash4.3):

실수

   Array variables may not (yet) be exported.

다음 코드는 함수가 실행되는 동안에만 환경에 임시 변수가 존재함을 보여줍니다. 함수가 완료되면 임시 변수가 사라집니다.

### defining the "bar" function
### it pass all environment variables to the "grep" command
### and the "grep" prints the only "my_var" variable from it
bar() { env | grep my_var=; }

### calls the "bar" function with the temporary 
### variable "my_var" created and assigned.
my_var=one bar

my_var=one         ### The output. The environment contains the "my_var" variable

### checks, does the environment still have the "my_var" variable
### (It doesn't have.)
env | grep my_var=
                   ### The output is empty,
                   ### the environment doesn't contain the "my_var" variable

관련 정보:

관련 정보