引数、ハイフン、その他の指定子スラッシュに置き換えられます。
一部のユニット名は、ファイル システムの名前空間に存在するパスを反映します。例: デバイス ユニット 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
、説明したとおりダッシュがハイフンに変更されることがわかります。
(ただし、この表現は私にとってはやや曖昧です。「エスケープされていない」は値がエスケープされていないという意味に解釈できますが、ここではエスケープが元に戻されていることを意味します。)