在 systemd 参数中使用连字符

在 systemd 参数中使用连字符

对于带有参数、连字符和其他说明符被替换为正斜杠。

某些单元名称反映文件系统命名空间中存在的路径。示例:设备单元 dev-sda.device 指的是文件系统命名空间中设备节点为 /dev/sda 的设备。如果适用,则会使用一种特殊的方法来转义路径名,以便结果可用作文件名的一部分。基本上,给定一个路径,“/”被“-”替换,所有其他非 ASCII 字母数字的字符被 C 风格的“\x2d”转义替换

--自由桌面网站

我试图传递一个带有连字符的参数,我注意到 systemd 单元不会用斜杠替换我的连字符。那么连字符不总是被替换吗?或者我只是错误地解释了事情?

基本上我想将一个字符串传递给一个 systemd 单元,该单元将一个字符串传递给我在单元中运行的可执行文件。

例如:

假设我有一个单元[email protected],在我想要执行的单元内:

/usr/local/bin/my_script param-with-hyphen

如果我尝试将带有连字符的参数传递给以下单元,如下所示:

$ systemctl start [email protected]

ExecStart=/usr/local/bin/my_script %i

它不会将字符串转换为 吗param/with/hyphen

在我的测试中,连字符没有被替换。

我做了一个单元:/etc/systemd/system/[email protected]

[Unit]
Description=Test arg %i

[Service]
ExecStart=/usr/bin/echo "arg: %i"

然后跑了systemctl start testunit@test-hyphen

结果不会替换连字符:

$ journalctl -u testunit@test-hyphen
Journal file /var/log/journal/f41c5d772fa24834926605125d59db1b/user-1000@4cc6a20c4391418eb972f65e6ecfafbe-000000000000043c-0005351d59c7b07b.journal is truncated, ignoring file.
-- Logs begin at Fri 2016-06-10 18:15:25 PDT, end at Sat 2016-09-24 23:12:42 PDT
Sep 24 23:12:25 Archon systemd[1]: Started Test arg test-hyphen.
Sep 24 23:12:25 Archon echo[6302]: arg: test-hyphen

答案1

您误读了文档:

基本上,给定一个路径,“/”被替换为“-”

文件系统路径中的斜杠被破折号替换,但它没有说明破折号被斜杠替换......这就是为什么在您的测试中,破折号保持原样。尽管可能发生的情况是,您的破折号将被替换为\x2d,这被解释为-沿着管道向下移动。

所有其他非 ASCII 字母数字的字符均替换为 C 风格的“\x2d”转义符

除了允许您指示如何转义或不转义您的参数之外,“说明符”部分似乎在这里没有太多相关性。

答案2

文档您链接到的解释就在表格中:转义不会自动撤消,但您必须明确要求:

“%i”实例名称:对于实例化单元:这是“@”字符和单元名称后缀之间的字符串。
“%I”未转义实例名称:与“%i”相同,但转义已撤消

使用%I而不是%i,您应该看到破折号更改为连字符,如您所描述的。

(不过,这个措辞对我来说有些模糊。“未转义”可以解释为表示该值未转义,但在这里意味着转义被撤消。)

相关内容