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

Dan*_*sta 10 linux bash supervisord

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

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

[program:install]
command=bash -c "/src/etc/install.sh"
Run Code Online (Sandbox Code Playgroud)

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

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

[program:install]
command=/src/etc/install.sh
Run Code Online (Sandbox Code Playgroud)

谢谢!

Mar*_*ala 10

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

bash -c可能只是对可能想在命令中使用此类功能的新手用户的帮助。例如,它避免了令人惊讶的

command=echo foo > /tmp/bar
Run Code Online (Sandbox Code Playgroud)

产出foo > /tmp/bar,而不是写foo/tmp/bar

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


Mar*_*ner 7

在文档中解释:

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

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

  • 马克,谢谢你的回答,但我认为另一个更合理的场景(虽然你的对我来说并没有错,但我仍然需要选择一个正确的答案..)。除此之外,我还以更少的积分帮助新用户。 (2认同)