如何在 ExecStart 中正确转义 shell 命令?

如何在 ExecStart 中正确转义 shell 命令?

运行这个:

[Unit]
Description=Save a screenshot
Wants=screenshot.timer

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'DISPLAY=:0 scrot /home/myuser/Pictures/Journal/$(date +"%s").png'

[Install]

结果是:

scrot: Saving to file /home/myuser/Pictures/Journal//usr/bin/zsh.png failed: No such file or directory

为什么?在 shell 中运行相同的命令可以正常工作:

% /bin/sh -c 'DISPLAY=:0 scrot /home/myuser/Pictures/Journal/$(date +"%s").png'
% echo $?
0
% 

我使用的命令是:

systemctl --user daemon-reload && systemctl --user start screenshot.service; systemctl --user status screenshot.service

答案1

systemd 单元可以利用各种“说明符”在许多领域,其中之一是%s

说明符 意义 细节
%s 用户外壳 这是运行服务管理器实例的用户的 shell。
%% 单个百分号 使用%%代替来%指定单个百分号。

当您需要%在受说明符解释的字段中的 systemd 单元中使用时,请改用%%

相关内容