Shellshock bash 복구가 echo 및 cat과 같은 기본 명령줄 도구를 손상시키나요? [복사]

Shellshock bash 복구가 echo 및 cat과 같은 기본 명령줄 도구를 손상시키나요? [복사]

나는 다음과 같은 일을 할 수 있었습니다:

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호출 시 구성되어 전달되어야 하는 입력 파일 설명자이기 때문입니다 .cat123$Xcatexecve

고려하다:

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.

관련 정보