나는 다음과 같은 일을 할 수 있었습니다:
X=123 cat <<EOF
X is $X
EOF
훨씬 더 간단합니다:
X=123 echo $X
bash 수정 사항을 설치한 후에도 첫 번째 수정 사항은 여전히 Mac OS X에서 작동하는 것으로 보이지만 AWS의 Ubuntu 14.04 인스턴스에서는 더 이상 작동하지 않는 것 같습니다. 이러한 환경 변수에 echo
더 이상 cat
액세스할 수 없는 이유는 무엇입니까 ? 더 이상한 점은 NodeJS 애플리케이션에 환경 변수를 전달할 때 아무런 문제도 없는 것 같다는 것입니다.
cat <<EOF > test.js
console.log('X is ' + process.env.X);
EOF
X=123 node test.js
이것은 bash 스크립트에서도 작동하는 것 같습니다.
cat <<EOF > test.sh
echo X is \$X
EOF
chmod +x test.sh
X=123 ./test.sh
답변1
POSIX 셸에서 다음을 작성할 때
X=123 echo $X
$X
전체 명령을 실행하기 전에 확장됩니다. 즉, 처음에 설정되지 않은 경우 다음을 얻게 $X
됩니다.
X=123 echo
그런 다음 실행하십시오. 쉘이 수행하는 작업을 대략적으로 볼 수 있습니다 set -x
.
$ set -x
$ X=123 echo X=$X
+ X=123
+ echo X=
X=
$ set +x
환경에 계속 액세스할 수 있음을 확인할 수 있습니다 echo
(실제로 실행하기 전에 확장되는 셸 자체 ).echo
$ X=123 eval 'echo $X'
123
문제는 cat <<EOF
비슷합니다. 와 관련하여 bash
이전 버전(4.1 이전)에는 CHANGES
문서에 다음과 같이 설명된 버그가 있습니다.
여기 문서의 변수가 임시 환경에서 보이도록 확장되는 버그를 수정했습니다.
이것이 Mac OS X에서 관찰되는 동작의 이유일 수 있습니다. 이 오류에 의존하지 마십시오.
답변2
여기에 있는 문서에 대한 귀하의 질문은 관련이 없을 수도 있습니다. 문제는 bash
확장과 할당이 동시에 수행된다는 것입니다. 따라서 행간이 X=123...
여기 문서에서 확장된 값에 영향을 주어서는 안 됩니다. 이는 설명자와 해당 환경의 나머지 부분이 전달되기 전에 할당되어야 하는 것과 마찬가지로 여기 문서가 bash
호출 시 구성되어 전달되어야 하는 입력 파일 설명자이기 때문입니다 .cat
123
$X
cat
execve
고려하다:
X=321; X=123 bash <<HEREDOC
echo "$X is not yet \$X and $$ is not yet \$$."
HEREDOC
산출
321 is not yet 123 and 17134 is not yet 17225.