다음 예가 나온 이유는 무엇입니까?화살의 대답$var
대신 출력 3
?
or $var
에 작은따옴표나 백슬래시를 사용합니다 .'$var'
\$var
- 먼저
$var
실행 가능한 프로그램의 실행 환경에 문자 그대로 전달됩니다/bin/echo
. - 그러면 실행 가능한 프로그램의 실행 환경에서 매개변수 확장이 발생하면
/bin/echo
환경변수가 적용된다.var=3
$var
실행 가능한 프로그램의 실행 환경 내에서 매개변수 확장이 발생하지 않는 이유는 무엇입니까 /bin/echo
?노트:
원본 셸에서는
$var
작은따옴표 또는 백슬래시이므로 원본 셸의 실행 환경에서 확장하면 안 됩니다.원래 쉘은 주변의 작은따옴표나 백슬래시를 제거한
$var
다음$var
환경 변수를var=3
실행의 실행 환경에 전달하므로/bin/echo
매개변수 확장은$var
실행의 실행 환경에서 이루어져야 한다고 생각합니다/bin/echo
.
참고로 저는 예전에는 set -x
추적정보를 출력하곤 했지만,확장 후 실행 전의 실제 결과가 무엇인지 알 수 없습니다.
감사해요.
tim$ unset var
$ set -x
tim$ var=3 /bin/echo '$var'
+ var=3
+ /bin/echo '$var'
$var
tim$ var=3 /bin/echo \$var
+ var=3
+ /bin/echo '$var'
$var
$ var=3 exec /bin/echo \$var | cat
+ cat
+ var=3
+ exec /bin/echo '$var'
$var
tim$ var=3 exec /bin/echo '$var' | cat
+ var=3
+ exec /bin/echo '$var'
+ cat
$var
답변1
각 경우에 변수가 확장되는 것을 방지하는 강력한 참조를 사용하거나 변수가 확장되는 것을 방지하는 강력한 참조를 사용합니다. 또는 이스케이프 $
문자를 사용하면 더 이상 확장해야 하는 변수가 아닙니다. /bin/echo
그리고 cat
매개변수나 변수 확장이 수행되지 않으므로 파이핑으로 인해 이런 일이 발생하지 않습니다.