[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를 호출하면 문자열이 아닌 인수를 위치 인수로 사용하도록 지시합니다. 작은따옴표는 문자열이 아니므로 위치 명령문으로 해석되어야 합니다.