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


22

운영체제 : 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)합니다.

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


3
아마도 bash가 환경 변수로 배열을 지원하지 않는다는 사실과 관련이 있습니까?
Jesse_b

3
@Jesse_b 아마도. 비록 내가 그것을 실행할 export var=(foo bar); echo "${var[0]}"때 인쇄 foo하지 않습니다 (foo bar).
nxnev

1
홀수, 저에게도 효과가있었습니다. 그리고 export그것을 사용 하여 보여줍니다 :declare -ax var=([0]="foo" [1]="bar")
Jesse_b

3
환경은 AFAIK 배열을 포함 할 수 없습니다. 예를 들어 export i_am_array=(foo bar); /usr/bin/env | grep i_am_array여기에 출력이 없습니다.
derobert

3
또한 : foo() { declare -p var; } ; var=(bar baz) foo부여합니다 declare -x var="(bar baz)"그 문자열로하지 배열을 치료할 확인
derobert

답변:


19

일반적으로 전화 :

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

12

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

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

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

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

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

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


5
여기서는 함수에 대한 것이므로 execve()시스템 호출이 필요 없기 때문에 아무것도 내 보내지 않아도 됩니다. zsh일시적으로 그런 식으로 설정된 배열로 함수 호출을 지원하는 쉘을 참조하십시오 .
Stéphane Chazelas

@ StéphaneChazelas 그러나 환경이 바뀌고 (새로운 변수를 추가함으로써) 함수가 완료된 후 (이 경우에 관한 것 my_var=one func_bar입니다.) 우리는 그것이 export환경에 추가되어 수출이 여기에서 사용 된다고 말할 수 있습니까 ? 내 대답을보고 데모 코드를 추가했습니다.
MiniMax

10

로부터 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

관련 정보:

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.