为什么在主pipe中使用`bash -c`而不是直接调用脚本?

我开始使用supervisord来控制服务器中的服务。 我不是Linux的专业用户,但可以很好地得到它并运行。

出于好奇,我已经注意到,supervisord中的大多数命令似乎被称为:

 [program:install] command=bash -c "/src/etc/install.sh" 

我读过bash的man,并且知道-c应该用来插入在string之后传递的variables。

那么在主pipe(或任何其他地方)使用bash -c什么意义,而不是直接调用脚本(如下面的例子),考虑到没有通过/使用的variables?

 [program:install] command=/src/etc/install.sh 

谢谢!

命令列表( * ,?),命令列表( ;&&|| ),redirect( <>| )等shell特性不由supervisord实现,只将命令拆分为参数string数组。

bash -c可能只是帮助新手用户,他们可能会试图在命令中使用这些function。 比如它避免了这个惊喜

 command=echo foo > /tmp/bar 

输出foo > /tmp/bar而不是将foo写入/tmp/bar

-c与variables无关。 任何额外的bash参数只能作为脚本参数$0$1等在命令中使用,但是该function很less使用。 例如bash -c 'echo $0 $0' foo输出foo foo

这在文档中有解释:

当supervisord运行一个subprocess时,没有shell被执行,所以环境variables例如USER,PATH,HOME,SHELL,LOGNAME等不会从默认值改变或者被重新分配。 当你以超级用户身份运行一个程序作为超级用户在configuration中以user = stanza身份运行时,这一点尤其重要。

为了解决这个问题,可以使用bash -c