在 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,您應該看到破折號更改為連字符,如您所描述的。

(不過,這個措辭對我來說有點模糊。「未轉義」可以解釋為意味著該值沒有轉義,但它在這裡意味著轉義被撤消。)

相關內容