ハイフンを含むパラメータの場合その他の指定子スラッシュに置き換えられます。
一部のユニット名は、ファイルシステムの名前空間に存在するパスを反映しています。例:デバイスユニットdev-sda.deviceは、ファイルシステムの名前空間にデバイスノード/ dev / sdaがあるデバイスを表します。該当する場合は、結果をファイル名の一部として使用できるように、パス名をエスケープするための特別な方法が使用されます。デフォルトでは、パスが与えられると、「/」は「-」に置き換えられ、ASCII以外のすべての英数字はCスタイルの「\ x2d」エスケープに置き換えられます。
ハイフンを含むパラメータを渡そうとしましたが、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スタイルの「\ x 2d」エスケープ文字に置き換えられます。
「指定子」部分は、引数をエスケープしたり、エスケープしない方法を表示するほか、ここでは多くの関連性がないようです。
答え2
これ文書リンクした説明は、次の形式になります。エスケープは自動的にキャンセルされませんが、明示的に要求する必要があります。
'%i'インスタンス名:インスタンス化されたユニットの場合: '@'文字とユニット名のサフィックスの間の文字列。
'%I' エスケープされていないインスタンス名: '%i' と同じですが、エスケープがキャンセルされました。
%I
代わりに を使用すると、説明どおり%i
ダッシュがハイフンに変わるのがわかります。
(私は表現が少し曖昧です。「Unescaped」は値がエスケープされていないという意味として解釈できますが、ここではエスケープがキャンセルされたことを意味します。)