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

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

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

出于好奇,我注意到 Supervisord 中的大多数命令似乎都是这样调用的:

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

我已阅读 bash 的手册,并且知道-c应该使用它来插入在字符串后传递的变量。

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

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

谢谢!

答案1

Supervisord 没有实现诸如路径名扩展(*, ?)、命令列表(;, &&, ||)、重定向(<, >, |, )等 Shell 功能,它仅将命令拆分为参数字符串数组。

bash -c可能只是对新手用户的帮助,他们可能会试图在命令中使用此类功能。例如,它避免了意外

command=echo foo > /tmp/bar

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

-c与变量关系不大。bash 的任何附加参数只能作为命令中的脚本参数$0$1等使用,但该功能很少有用。例如bash -c 'echo $0 $0' foo输出foo foo

答案2

解释如下在文档中

当运行子进程时,supervisord 不会执行任何 shell,因此 USER、PATH、HOME、SHELL、LOGNAME 等环境变量不会从其默认值更改或以其他方式重新分配。当您以 root 身份从配置中的 user= 节运行的 Supervisord 运行程序时,这一点尤其重要。

bash -c可以使用来解决此问题。

相关内容