まずはシンプルな例。psコマンドを呼び出したシェルのプロセスIDは28676ということが判る。
$ ps wxf -U hoge; echo $$; PID TTY STAT TIME COMMAND 28676 pts/6 Ss 0:00 \_ /bin/bash 28831 pts/6 R+ 0:00 \_ ps wxf -U hoge 28676
sh -c を使用した例。ps コマンドを呼び出したシェルのプロセスIDは28832で、このプロセスはプロセスID28676から呼び出されたということが判る。
$ sh -c 'ps wxf -U hoge; echo $$;' PID TTY STAT TIME COMMAND 28676 pts/6 Ss 0:00 \_ /bin/bash 28832 pts/6 S+ 0:00 \_ sh -c ps wxf -U hoge; echo $$; 28833 pts/6 R+ 0:00 \_ ps wxf -U hoge 28832
つまり、sh -cを使うとプロセスが1つ作られてこのプロセスの中で引数に与えられたコマンドが走る。便利だと思われる良い例が見つからない。例えばcronではsh -cのテクニックが使われている。
1109 ? Ss 0:05 /usr/sbin/cron 7722 ? S 0:00 \_ /USR/SBIN/CRON 7723 ? Ss 0:00 \_ /bin/sh -c bash ~/****************.sh 2>&1 7724 ? R 0:16 \_ bash /home/****/****************.sh