Использование дефисов в аргументах systemd

Использование дефисов в аргументах systemd

С единицами systemd, имеющими аргументы, дефисы идругие спецификаторызаменяются косыми чертами.

Некоторые имена единиц отражают пути, существующие в пространстве имен файловой системы. Пример: единица устройства dev-sda.device ссылается на устройство с узлом устройства /dev/sda в пространстве имен файловой системы. Если это применимо, используется специальный способ экранирования имени пути, так что результат можно использовать как часть имени файла. В основном, при указании пути "/" заменяется на "-", а все другие символы, которые не являются буквенно-цифровыми символами ASCII, заменяются экранированными символами "\x2d" в стиле C

--freedesktop.org

Я пытался передать аргумент с дефисом и заметил, что модуль 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, заменяются экранированными символами "\x2d" в стиле C

Раздел «Спецификаторы», похоже, не имеет здесь особого значения, за исключением того, что он позволяет вам указать, каким образом экранируются или не экранируются ваши аргументы.

решение2

TheдокументПо ссылке, на которую вы дали ссылку, есть объяснение: экранирование не отменяется автоматически, но вам нужно специально попросить об этом:

"%i" Имя экземпляра: Для инстанцированных единиц: это строка между символом "@" и суффиксом имени единицы.
"%I" Неэкранированное имя экземпляра: То же, что и "%i", но с отмененным экранированием

Используя %Iвместо %i, вы должны увидеть, как тире меняются на дефисы, как вы описываете.

(Хотя эта формулировка мне кажется несколько расплывчатой. «Неэкранированное» можно интерпретировать как то, что значение не экранировано, но в данном случае это означает, что экранирование отменено.)

Связанный контент