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


11

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

出于好奇,我已经注意到,supervisor中的大多数命令看起来像这样:

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

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

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

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

谢谢!

Answers:


11

壳设有诸如路径扩展(*?),命令列表(;&&||),重定向(<>|,)不被supervisord实现仅拆分命令到参数字符串的数组。

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


1
谢谢,这是一个非常务实的答案,这可能会节省很多时间。作为新手,我会犯此错误(并且永远不要考虑bash -c解决方案!)。
丹尼尔·科斯塔

6

在文档中对此进行了解释:

主管在运行子进程时不会由外壳程序执行任何外壳程序,因此不会更改环境变量(例如USER,PATH,HOME,SHELL,LOGNAME等)的默认值,也不会对其进行其他分配。当您在配置中以user =节从root用户以超级用户身份运行程序时,要特别注意这一点。

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


2
马克,谢谢您的回答,但我认为另一种情况似乎更合理(尽管您的回答对我而言并不正确,但我仍然需要选择一个正确的答案..)。除此之外,我还以更少的积分帮助新用户。
丹尼尔·科斯塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.