스크립트 가 있습니다 ./scr
.
abc@~ $ cat scr
#!/bin/bash
ps
echo '-------'
echo "$(ps)"
abc@~ $
내 목표는 하위 프로세스가 어떻게 생성되는지 알아내는 것입니다. 내가 아는 한, 이 $(...)
부분은 서브쉘을 생성하여 새로운 프로세스를 생성하도록 되어 있습니다. 따라서 두 번째 호출의 프로세스 수가 ps
더 커야 합니다.
현재 셸에서 스크립트를 가져오면 다음과 같은 일이 발생합니다.
abc@~ $ . scr
PID TTY TIME CMD
1659 ttys000 0:00.17 -bash
-------
PID TTY TIME CMD
1659 ttys000 0:00.17 -bash
1785 ttys000 0:00.00 -bash
abc@~ $
그러나 해석된 셸에서 시작될 때 프로세스 수에는 차이가 없습니다.
abc@~ $ ./scr
PID TTY TIME CMD
1659 ttys000 0:00.17 -bash
1790 ttys000 0:00.00 /bin/bash ./scr
-------
PID TTY TIME CMD
1659 ttys000 0:00.17 -bash
1790 ttys000 0:00.00 /bin/bash ./scr
abc@~ $
왜 그럴까요?
마찬가지로, 왜 ps
와 동일한 출력을 제공합니까 (ps)
?
abc@~ $ ps
PID TTY TIME CMD
1659 ttys000 0:00.18 -bash
abc@~ $ (ps)
PID TTY TIME CMD
1659 ttys000 0:00.18 -bash
abc@~ $
흥미롭게도 명령 앞에 다른 명령을 추가하면 예상되는 새 프로세스가 "생성"됩니다(또한 ps
상단의 스크립트에서 예상 프로세스가 생성됩니다)../scr
abc@~ $ (echo 1; ps)
1
PID TTY TIME CMD
1659 ttys000 0:00.20 -bash
1823 ttys000 0:00.00 -bash
abc@~ $
(ps)
쉘이 어떤 방식으로 "최적화"되어 있습니까? 소스에는 왜 이런 내용이 없나요?
참고 사항: 시스템은 실제로 macOS이지만 이 경우에는 다르게 작동하지 않을 것 같습니다.
편집하다:
에서와 같이이 답변, 서브쉘은 최적화가 필요한 것으로 보이므로 분명히 필요하지 않기 때문에 새로 실행된 별도의 쉘에서 실행되지 않습니다.
현재 쉘에서 실행할 때 왜 필요한가요? 그렇다면 ( . scr
)?
답변1
명령 대체는 "서브쉘 환경", 반드시 본격적인 하위 쉘일 필요는 없습니다. 하위 쉘 환경 없이 효과를 얻을 수 있다면 쉘은 쓸모없는 프로세스 생성을 피할 것입니다. 본격적인 하위 쉘을 보려면 서브 쉘의 전체 비교를 제공하십시오.
$ echo "$(ps fax)"
PID TTY STAT TIME COMMAND
...
1317 ? Ss 0:00 /usr/sbin/sshd -D
1751 ? Ss 0:00 \_ sshd: alexp [priv]
1788 ? S 0:00 \_ sshd: alexp@pts/0
1789 pts/0 Ss+ 0:00 \_ -bash
1822 pts/0 R+ 0:00 \_ ps fax
...
$ echo "$(ps fax; echo)"
PID TTY STAT TIME COMMAND
...
1317 ? Ss 0:00 /usr/sbin/sshd -D
1751 ? Ss 0:00 \_ sshd: alexp [priv]
1788 ? S 0:00 \_ sshd: alexp@pts/0
1789 pts/0 Ss+ 0:00 \_ -bash
1823 pts/0 S+ 0:00 \_ -bash
1824 pts/0 R+ 0:00 \_ ps fax
...