Usando hífens em argumentos do systemd

1

Com unidades do systemd que têm argumentos, hipeses e outros especificadores são substituídos com barras para a frente.

Some unit names reflect paths existing in the file system namespace. Example: a device unit dev-sda.device refers to a device with the device node /dev/sda in the file system namespace. If this applies, a special way to escape the path name is used, so that the result is usable as part of a filename. Basically, given a path, "/" is replaced by "-", and all other characters which are not ASCII alphanumerics are replaced by C-style "\x2d" escapes

-- freedesktop.org

Eu estava tentando passar uma discussão com um hífen e notei que a unidade systemd não substitui meus hífens por uma barra. Então hífens nem sempre são relegados? Ou estou apenas interpretando as coisas incorretamente?

Basicamente eu quero passar uma string para uma unidade systemd que passa uma string para o executável que estou rodando na unidade.

Por exemplo:

Digamos que eu tenha uma unidade [email protected] , dentro da unidade que quero executar:

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

Se eu tentar passar o argumento com um hífen para a seguinte unidade assim:

$ systemctl start [email protected]

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

Não converterá a string em param/with/hyphen ?

Nos meus testes, o hífen não é substituído.

Eu fiz uma unidade: /etc/systemd/system/[email protected]

[Unit]
Description=Test arg %i

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

e executou systemctl start testunit@test-hyphen

O resultado não substitui o hífen:

$ 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
    
por johnramsden 25.09.2016 / 05:19

2 respostas

3

Você leu mal a documentação:

Basically, given a path, "/" is replaced by "-"

Barras em um caminho do sistema de arquivos são substituídas por traços, mas ele não diz nada sobre traços sendo substituídos por barras ... e é por isso que no seu teste, os traços permanecem como estão. Embora o que provavelmente está acontecendo, seus traços estão sendo substituídos por \x2d , que é interpretado como - quando ele se move para baixo no pipeline.

all other characters which are not ASCII alphanumerics are replaced by C-style "\x2d" escapes

A seção "Especificadores" não parece ter muita relevância aqui, além de permitir que você determine como seus argumentos são ou não escapados.

    
por 25.09.2016 / 08:30
1

O documento ao qual você está vinculado tem a explicação correta na tabela: o escape não é desfeito automaticamente, mas você tem que perguntar especificamente:

"%i" Instance name: For instantiated units: this is the string between the "@" character and the suffix of the unit name.
"%I" Unescaped instance name: Same as "%i", but with escaping undone

Usando %I em vez de %i , você deve ver os traços alterados para hifens, conforme descrito.

(Esse texto é um pouco vago para mim, no entanto, "sem escape" poderia ser interpretado como significando que o valor não escapou, mas significa aqui que o escape é desfeito.)

    
por 25.09.2016 / 10:16

Tags