아래 예에서 프로세스 ID가 포함된 작은따옴표와 큰따옴표에 무슨 일이 일어나고 있는지 정확히 설명할 수 있는 사람이 있습니까? [복사]

아래 예에서 프로세스 ID가 포함된 작은따옴표와 큰따옴표에 무슨 일이 일어나고 있는지 정확히 설명할 수 있는 사람이 있습니까? [복사]
[root@localhost ~]# echo $$
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c "echo $$"
16991
[root@localhost ~]# bash -c 'echo $$'
21062
[root@localhost ~]# bash -c 'echo $$'
21063
[root@localhost ~]# bash -c 'echo $$'
21064
[root@localhost ~]# bash -c "echo $$"
16991

내가 아는 한, 작은 따옴표를 사용할 때마다 새로운 하위 쉘이 생성되고 큰 따옴표에서는 같은 일이 발생하지 않습니다. 왜 그럴까요?

답변1

요약: 쉘은 큰따옴표로 묶인 문자열에 대해 매개변수 대체를 수행하지만아니요작은 따옴표로 묶인 문자열. $$은 쉘 PID이지만 표시되는 숫자는 다음에 따라 다릅니다.어느쉘이 이를 평가합니다.

세부 사항: 각 상황을 한 번에 하나씩 고려해 봅시다.

[root@localhost ~]# echo $$
16991

16991은 현재 쉘의 PID입니다. 이를 메인 쉘이라고 부릅니다.

[root@localhost ~]# bash -c "echo $$"
16991

메인 쉘에서 이를 발견하면 "echo $$"16991로 대체됩니다 $$. 따라서 전달된 문자열 bash -c은 입니다 echo 16991. 이것이 16991이 인쇄되는 이유입니다.

[root@localhost ~]# bash -c 'echo $$'
21062

작은따옴표 때문에 'echo $$'기본 쉘은 매개변수 대체를 수행하지 않습니다. 문자열은 .21062 echo $$로 전달되어 bash -c프로세스의 PID이므로 인쇄됩니다 bash -c.

[root@localhost ~]# bash -c 'echo $$'
21063

다음에 bash -c프로세스가 실행되면 이번에는 21063이라는 새로운 PID를 갖게 됩니다.

답변2

작은 따옴표는 강한 따옴표이며 bash는 이를 큰 따옴표와 같은 문자열이 아닌 인수로 읽습니다. -c 옵션을 사용하여 bash를 호출하면 문자열이 아닌 인수를 위치 인수로 사용하도록 지시합니다. 작은따옴표는 문자열이 아니므로 위치 명령문으로 해석되어야 합니다.

http://tldp.org/LDP/abs/html/bash-options.html

관련 정보