如何将多行内容转换为 systemd 单元文件中的文件?

F21*_*F21 4 systemd

我正在尝试将文件写入磁盘作为ExecStartPresystemd 单元文件命令的一部分。

这就是我正在使用的:

[Unit]
Description=My service

[Service]
Restart=always
StartLimitInterval=0
ExecStartPre=/usr/bin/cat <<EOFDefaults > /tmp/test
option1=value1
option2=value2
EOFDefaults

ExecStart=/run/some/command
Run Code Online (Sandbox Code Playgroud)

由于这是一个多行命令,因此在使用systemd-analyze verify myservice.service.

所以,我试图逃避多行:

[Unit]
Description=My service

[Service]
Restart=always
StartLimitInterval=0
ExecStartPre=/usr/bin/cat <<EOFDefaults > /tmp/test \
option1=value1 \
option2=value2 \
EOFDefaults

ExecStart=/run/some/command
Run Code Online (Sandbox Code Playgroud)

测试单元文件时,出现以下错误: Invalid escape sequences in command line:

作为 systemd 单元文件命令的一部分,如何使用 cat 将多行内容写入文件?

小智 5

你没有。请参阅命令行上的文档部分:

此语法旨在与 shell 语法非常相似,但只能理解以下段落中描述的元字符和扩展。具体来说,不支持使用“<”、“<<”、“>”和“>>”的重定向,使用“|”的管道,使用“&”在后台运行程序以及其他shell语法元素。

您可以通过首先使用以下内容调用 shell 来执行此操作:

    ExecStartPre=/bin/sh -c '/usr/bin/cat <<EOFDefaults > /tmp/test \
    option1=value1 \
    option2=value2 \
    EOFDefaults'
Run Code Online (Sandbox Code Playgroud)

然而,它很快就会变得杂乱无章。

我要做的是将它放在一个单独的 shell 脚本中,并从服务定义中调用它。一般来说,最好保持服务定义尽可能清晰。

  • @F21 在每个尾随“\”之前还需要一个“\n”,因为否则这些行只是连接成一行。还要考虑删除尾随“\”之前的无关空格,否则这些空格将出现在此处文档中,并且如果导致问题,可能会成为难以发现的错误。 (2认同)