したがって、次のコマンドを入力すると、PID 4920
サブシェルは子プロセス()を生成します。
linuxprobe@DESKTOP-TP0G72N:~$ (sleep 2;ps -f --forest;sleep 5)
UID PID PPID C STIME TTY TIME CMD
linuxpr+ 513 512 0 Feb17 pts/0 00:00:00 -bash
linuxpr+ 4920 513 0 01:35 pts/0 00:00:00 \_ -bash
linuxpr+ 4922 4920 0 01:35 pts/0 00:00:00 \_ ps -f --forest
次のコマンドを入力すると、子プロセスが生成されないようです。
linuxprobe@DESKTOP-TP0G72N:~$ (ps -f --forest)
UID PID PPID C STIME TTY TIME CMD
linuxpr+ 513 512 0 Feb17 pts/0 00:00:00 -bash
linuxpr+ 5511 513 0 01:45 pts/0 00:00:00 \_ ps -f --forest
最初の例では、サブシェルがサブプロセスを生成できるのはなぜですか?
答え1
それは缶の問題ではありません。ご覧のとおり、両方ともサブプロセスを作成します。
違いは、2番目のケースでは、シェルの最後のコマンドがpsによって実行されることです。
それ以降は何も起こらないため、bashはフォークされたプロセスで実行しないことを決定し、以前にフォークせずにps実行可能ファイル自体を直接実行します。
だから問題ありません。できるしかし、問題は選択しない、最適化。