如何通过 systemd 运行以子 shell 作为命令行参数的 shell 脚本

如何通过 systemd 运行以子 shell 作为命令行参数的 shell 脚本

我有一个 shell 脚本,它接受表示为其他 shell 脚本输出的命令行参数,也就是说:

myscript1.sh -opt `myscript2.sh` 

我需要通过 systemd 启动这个脚本

我尝试在 .service 文件中添加此指令

...
[Service]
...
ExecStart=/bin/bash -c "myscript1.sh -opt `myscript2.sh`"
...

并且该解决方案确实有效。

myscript1.sh我的问题是:是否可以不使用命令直接启动脚本/bin/bash

答案1

从文档开始,请参阅man systemd.service

ExecStart=启动此服务时执行的带有参数的命令。根据下面描述的规则,该值被分成零个或多个命令行(请参阅下面的“命令行”部分)。

然后按照交叉引用

命令行本节描述命令行解析以及ExecStart=[...和其他...]选项的变量和说明符替换。

多个命令行可以通过用分号分隔来连接在单个指令中(这些分号必须作为单独的单词传递)。单独的分号可以转义为“;”。

[…]

该语法受到 shell 语法的启发,但只理解后面几段描述的元字符和扩展,变量的扩展是不同的。具体来说,不支持使用<<<>和的重定向,>>使用 的管道|,使用 的后台运行程序以及 shell 语法的其他元素。&

因此很明显,该ExecStart=选项不是由 shell 解析的,而是由实现 shell 代码的非常有限子集的进程解析的。

我会使用你的代码的这个变体,它使用更简单的外壳和更现代的反引号替代品

ExecStart=/bin/sh -c 'myscript1.sh -opt $(myscript2.sh)'

相关内容