출력이 `3` 대신 `$var` 아래에 표시되는 이유는 무엇입니까? [폐쇄]

출력이 `3` 대신 `$var` 아래에 표시되는 이유는 무엇입니까? [폐쇄]

다음 예가 나온 이유는 무엇입니까?화살의 대답$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매개변수나 변수 확장이 수행되지 않으므로 파이핑으로 인해 이런 일이 발생하지 않습니다.

관련 정보