![为什么在主管中使用“bash -c”而不是直接调用脚本?](https://linux22.com/image/666783/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E4%B8%BB%E7%AE%A1%E4%B8%AD%E4%BD%BF%E7%94%A8%E2%80%9Cbash%20-c%E2%80%9D%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B4%E6%8E%A5%E8%B0%83%E7%94%A8%E8%84%9A%E6%9C%AC%EF%BC%9F.png)
我开始使用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
可以使用来解决此问题。