daemontoolsのrunファイルで、exec COMMANDじゃなくてshを介してexec sh -c 'exec COMMAND'する理由

だいぶ昔になんでかなーなんでだろーなーと思ったこと:
dnscache-confで作ったrunファイルが、

#!/bin/sh
exec 2>&1
exec <seed
exec envdir ./env \
       envuidgid dnscache softlimit -o250 -d "$DATALIMIT" /usr/local/bin/dnscache

じゃなくて、こんなふうに、

#!/bin/sh
exec 2>&1
exec <seed
exec envdir ./env sh -c '
  exec envuidgid dnscache softlimit -o250 -d "$DATALIMIT" /usr/local/bin/dnscache
'

わざわざshをexecして、そのshのなかでお目当てのプログラムを起動してたこと。


で、今日、某IRCチャンネルみてて気がついたんですが、これって

echo 2000000 > env/DATALIMIT

みたいに外部ファイルで設定値変更するためだったんすね。

exec \
  envdir ./env \
  softlimit -d "$DATALIMIT" \
  COMMAND

だと、"$DATALIMIT" は env/DATALIMIT の値に展開されないけど、

exec \
  envdir ./env \
  sh -c '
    exec \
    softlimit -d "$DATALIMIT" \
    COMMAND
  '

なら、envdir ./envによって、$DATALIMIT がセットされたシェルの中で "$DATALIMIT" が評価されるからちゃんと展開されるという。


というわけで、

#!/bin/sh
# to change VIRTSIZE
#   echo $((768*1024*1024)) > env/VIRTSIZE
exec 2>&1
exec \
  envdir ./env \
    sh -c 'exec \
      setuidgid hirose31 \
      env - PATH=$PATH:/command \
      softlimit -a ${VIRTSIZE:-$((512*1024*1024))} \
      ./do \
  '

な run ファイルが書けるようになってご満悦です。