매개변수 인플레이션을 방지하는 방법은 무엇입니까?

매개변수 인플레이션을 방지하는 방법은 무엇입니까?

매개변수 인플레이션을 방지하는 방법은 무엇입니까? 하다배쉬 매뉴얼이것이 어딘가에 언급되어 있습니까? 거기에 언급된 위치를 찾는 데 도움을 주시면 감사하겠습니다.

예를 들어,

$ b=1
$ echo $b
1

bash 인터프리터가 이를 해석할 때 실행되기 전에 echo $b매개변수 확장이 발생합니다 . 따라서 자식 프로세스에 전달하기 위해 쉘 프로세스에 대한 환경 변수를 생성할 필요가 없습니다 .$becho $bbecho $b

비교를 위해 다른 예를 고려하십시오https://unix.stackexchange.com/a/261406/674

$ b=1
$ c=$(b=2; echo $b)
$ echo $c
2

원래 셸에서는 bash 인터프리터가 해석할 때 값으로 확장 c=$(b=2; echo $b)되지 않습니다 .$b1

명령 대체 서브셸에서 bash 인터프리터가 이를 해석하면 값으로 확장 b=2; echo $b됩니다 .$b2

원래 쉘에서 매개변수 확장을 방지 $b하지만 $b하위 쉘로의 매개변수 확장을 유지하는 것은 무엇입니까?

따옴표는 매개변수 확장을 방지합니다. 예를 들어 "$b"여기서 매개변수 확장은 따옴표 없이 이루어집니다. 명령 대체가 그 안에서 매개변수 확장을 방지합니까?

답변1

오해하셨네요. 큰따옴표는 "$b"매개변수 확장을 막지 못합니다.경로 이름 확장(일명 와일드카드)그리고필드 단편화.

매개변수 확장을 방지하려면 다음을 사용해야 합니다.인용하다, 좋다아포스트로피 '$b'또는도망가다 \$b:

$ echo '$b'

또는:

$ echo \$b

그런 다음 $b문자 그대로 출력하십시오.


이 예에서는 매개변수 확장을 방해하는 것이 없습니다.

쉘이 input 을 읽으면 c=$(b=2; echo $b)실행됩니다.토큰 인식$(, 이것이 명령으로 대체된 토큰임을 확인하세요 . 따라서 $(및 사이의 나머지 문자열은 )현재 쉘이 아닌 명령 대체에 의해 생성된 하위 쉘에서 해석되는 것으로 처리됩니다.

관련 정보