Usar guiones en argumentos de systemd

Usar guiones en argumentos de systemd

Con unidades systemd que tienen argumentos, hypens yotros especificadoresse reemplazan con barras diagonales.

Algunos nombres de unidades reflejan rutas existentes en el espacio de nombres del sistema de archivos. Ejemplo: una unidad de dispositivo dev-sda.device hace referencia a un dispositivo con el nodo de dispositivo /dev/sda en el espacio de nombres del sistema de archivos. Si esto aplica, se utiliza una forma especial de escapar del nombre de la ruta, de modo que el resultado se pueda utilizar como parte de un nombre de archivo. Básicamente, dada una ruta, "/" se reemplaza por "-", y todos los demás caracteres que no sean alfanuméricos ASCII se reemplazan por escapes "\x2d" estilo C.

--freedesktop.org

Estaba intentando pasar un argumento con un guión y noté que la unidad systemd no reemplaza mis guiones con una barra. Entonces, ¿los guiones no siempre están relacionados? ¿O simplemente estoy interpretando las cosas incorrectamente?

Básicamente quiero pasar una cadena a una unidad systemd que pasa una cadena al ejecutable que estoy ejecutando en la unidad.

Por ejemplo:

Digamos que tengo una unidad [email protected], dentro de la unidad que quiero ejecutar:

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

Si intento pasar el argumento con un guión a la siguiente unidad de esta manera:

$ systemctl start [email protected]

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

¿No convertirá la cadena a param/with/hyphen?

En mis pruebas, el guión no se reemplaza.

Hice una unidad:/etc/systemd/system/[email protected]

[Unit]
Description=Test arg %i

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

y corriósystemctl start testunit@test-hyphen

El resultado no reemplaza el guión:

$ 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

Respuesta1

Leíste mal la documentación:

Básicamente, dada una ruta, "/" se reemplaza por "-"

Las barras en una ruta del sistema de archivos se reemplazan por guiones, pero no dice nada acerca de que los guiones se reemplacen por barras... razón por la cual en su prueba, los guiones permanecen como están. Aunque lo que probablemente esté sucediendo es que sus guiones están siendo reemplazados por \x2d, lo que se interpreta como -que avanza por la tubería.

todos los demás caracteres que no sean alfanuméricos ASCII se reemplazan por escapes "\x2d" estilo C

La sección sobre "Especificadores" no parece tener mucha relevancia aquí, aparte de permitirle indicar cómo se escapan o no sus argumentos.

Respuesta2

Eldocumentoal que se vinculó tiene la explicación directamente en la tabla: el escape no se deshace automáticamente, pero debe solicitarlo específicamente:

"%i" Nombre de instancia: Para unidades instanciadas: esta es la cadena entre el carácter "@" y el sufijo del nombre de la unidad.
"%I" Nombre de instancia sin escape: Igual que "%i", pero con el escape deshecho

Al usar %Ien lugar de %i, debería ver los guiones cambiados a guiones como lo describe.

(Sin embargo, esa redacción es algo vaga para mí. "sin escape" podría interpretarse en el sentido de que el valor no se escapa, pero aquí significa que el escape se deshace).

información relacionada