명령 대체 서브셸의 bash 변수 가시성

명령 대체 서브셸의 bash 변수 가시성

Linux 쉘 스크립팅 책을 읽다가 다음 경고를 발견했습니다.

"명령 대체는 포함된 명령을 실행하기 위해 하위 쉘이라는 것을 생성합니다. 하위 쉘은 스크립트를 실행하는 쉘에서 생성된 별도의 하위 쉘입니다. 따라서 스크립트에서 생성한 모든 변수는 하위 쉘 명령에 사용할 수 없습니다."

현재 bash 쉘의 CLI에서 변수를 생성한 다음 하위 쉘로 이동하여 화면에 인쇄할 수 있는지 확인했습니다. 예, 할 수 없습니다. 위의 인용문을 기반으로 한 것 같습니다. 그러나 명령 대체를 통해 다음 스크립트를 실행했습니다.

#!/bin/bash
var=5.5555
ans=$(echo $var)
echo $ans

결과 :

5.5555

내가 이해한 바로는 서브쉘이 "볼" 수 없어야 하기 때문에 var의 값을 인쇄해서는 안 됩니다. 왜 이런 일이 발생합니까?

답변1

성명서:

따라서 스크립트에서 생성한 모든 변수는 subshell 명령에서 사용할 수 없습니다.

가짜입니다. 상위 셸에 정의된 변수의 범위는 전체 스크립트(명령 대체를 통해 생성된 하위 셸 포함)입니다.

달리기:

#!/bin/bash
var=5.5555
ans1=$(echo $var)
ans2=$(var=6; echo $var)
echo $ans1
echo $ans2

결과는 다음과 같습니다.

5.5555
6

$var서브쉘로 해결됨:

  • 지역 변수를 지정하지 않으면 세 가지 전역 변수의 값이 사용됩니다.
  • 지역 변수가 지정되면 해당 값을 사용합니다.

또한보십시오예 21-2.

답변2

인용된 주장은 사실이 아닙니다. 서브쉘이 실행되기 전에 변수가 사전 대체되는 것도 올바르지 않습니다.

다음을 사용하여 직접 확인할 수 있습니다.가변 간접:

$ x=hello
$ echo Result is $(y=x ; echo ${!y} ; echo world)
Result is hello world

변수는 변수에서 읽기 x때문에 (이전에 값을 확장하지 않고) 서브쉘에서 직접 사용할 수 있습니다.${!y}이름저장 위치 y- 서브쉘이 생성될 때 존재하지 않습니다.


책의 이 구절에 대한 좋은 해석은 "변수"의 값을 영구적으로 수정할 수 없기 때문에 사용할 수 없다는 의미입니다. 새 변수(예 y:)를 생성하거나 기존 변수에 대체 값을 할당하든 관계없이 하위 셸에서 수행한 모든 변수 할당은 나중에 상위 셸에서 사용할 수 없습니다 . 서브셸이 에 할당된 경우 x새 값은 서브셸 내에서 적용되지만 이후에 해당 값을 읽으면 원래 값이 제공됩니다.

$ x=world
$ echo $(x=hello ; echo $x)
hello
$ echo $x
world

적어도 당신이 인용한 구절에서는 그렇게 말하는 방식이 아주 명확하지는 않습니다. 책 전체가 이와 같다면 더 나은 책을 찾을 수 있을 것입니다(또는 여기에서 질문을 읽으십시오).

관련 정보