我有一个 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)'