Bash의 가능한 버그? : foo () {echo “$ {var [0]}”; }; var = (바 바즈) foo Why this foo()

운영체제 : Ubuntu 16.04.3

: Bash 4.3.48


에서 var=value command와 같이 변수의 내용을 일시적으로 변경하는 것이 가능하다는 것을 알고 있습니다 IFS= read -r var.

그리고 Greg의 Wiki 덕분에 다음 사항도 이해합니다.

# 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)합니다.

이것은 나에게만 발생합니까? 이것이 의도 된 동작입니까, 뭔가 빠졌습니까? 아니면 버그입니까?



답변

일반적으로 전화 :

var=value cmd

cmd기능이 이식성이없는 곳 은 어디 입니까?

bash스칼라 변수를 작동, (그리고와 x=(...)배열로 해석하지만, 스칼라로 할당)하고 해당를 할 경우로 범위 지정에 문제가 있습니다 ksh93yash, 작동하지만 변수 정의는 이후 남아있다가. 를 사용하면 mksh구문 오류가 발생합니다. Bourne 쉘에서는 스칼라 변수조차도 전혀 작동하지 않았습니다.

또한 스칼라 변수의 경우에도 변수가 함수 에서 내보내 지는지 (즉, 실행중인 명령에 전달 되는지 ) 쉘마다 다릅니다 (bash, yash, mksh, zsh에 있지만 ksh에는 없음). 금연 건강 증진 협회).

예상 한 방식으로 만 작동합니다 zsh. 참고 zsh배열 인덱스는 1부터 시작한다.

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


답변

그것은 단지 버그가 아니며 구현 계획이없는 구현되지 않은 기능 인 것 같습니다. 2014 년에 작성된메일 링리스트 게시물 은 작성자의 게시물 입니다.

다행히도 bash 4.3 (패치 레벨 25)에서는 -DARRAY_EXPORT 만 할 수없고 배열 변수 가져 오기 / 내보내기를 수행 할 수 없습니다. 코드는 컴파일되지 않으며, 수정하면 연결되지 않으며, 수정하면 다음 문제가 발생합니다.

이것만으로도 많은 어려움이 있습니다. 어레이 내보내기를 활성화 할 계획이 없습니다.

Bash의 최신 git repo에서 가져 오는 것은 다음과 variables.c같습니다.

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

완료되지 않은 것을 제안합니다.


답변

로부터 man bash의 버그 섹션 (의 버전은 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

관련 정보:


답변