매개변수 인플레이션을 방지하는 방법은 무엇입니까? 하다배쉬 매뉴얼이것이 어딘가에 언급되어 있습니까? 거기에 언급된 위치를 찾는 데 도움을 주시면 감사하겠습니다.
예를 들어,
$ b=1
$ echo $b
1
bash 인터프리터가 이를 해석할 때 실행되기 전에 echo $b
매개변수 확장이 발생합니다 . 따라서 자식 프로세스에 전달하기 위해 쉘 프로세스에 대한 환경 변수를 생성할 필요가 없습니다 .$b
echo $b
b
echo $b
비교를 위해 다른 예를 고려하십시오https://unix.stackexchange.com/a/261406/674
$ b=1
$ c=$(b=2; echo $b)
$ echo $c
2
원래 셸에서는 bash 인터프리터가 해석할 때 값으로 확장 c=$(b=2; echo $b)
되지 않습니다 .$b
1
명령 대체 서브셸에서 bash 인터프리터가 이를 해석하면 값으로 확장 b=2; echo $b
됩니다 .$b
2
원래 쉘에서 매개변수 확장을 방지 $b
하지만 $b
하위 쉘로의 매개변수 확장을 유지하는 것은 무엇입니까?
따옴표는 매개변수 확장을 방지합니다. 예를 들어 "$b"
여기서 매개변수 확장은 따옴표 없이 이루어집니다. 명령 대체가 그 안에서 매개변수 확장을 방지합니까?
답변1
오해하셨네요. 큰따옴표는 "$b"
매개변수 확장을 막지 못합니다.경로 이름 확장(일명 와일드카드)그리고필드 단편화.
매개변수 확장을 방지하려면 다음을 사용해야 합니다.인용하다, 좋다아포스트로피 '$b'
또는도망가다 \$b
:
$ echo '$b'
또는:
$ echo \$b
그런 다음 $b
문자 그대로 출력하십시오.
이 예에서는 매개변수 확장을 방해하는 것이 없습니다.
쉘이 input 을 읽으면 c=$(b=2; echo $b)
실행됩니다.토큰 인식$(
, 이것이 명령으로 대체된 토큰임을 확인하세요 . 따라서 $(
및 사이의 나머지 문자열은 )
현재 쉘이 아닌 명령 대체에 의해 생성된 하위 쉘에서 해석되는 것으로 처리됩니다.