Acabo de tener problemas para citar y ejecutar la siguiente línea de comando en la clave ExecStart
de un archivo de unidad de servicio:
IFS=$'\n'; f=($(ls $HOME/bk.d/DuckieTV*.backup | tail -n +2)); echo "${f[@]}"
Lo citaré usando las reglas de cotización de systemd y luego explicaré lo que aprendí en el proceso. Parece complicado porque esperamos que siga las reglas de cotización de los shells POSIX, pero de hecho es aún más simple. Aquí está la directiva ExecStart
, correctamente citada
ExecStart=/bin/bash -c 'IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\"'
o
ExecStart=/bin/bash -c "IFS=$$\'\\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\""
Entonces, las reglas de cotización:
Si desea que systemd realice la sustitución de variables, no incluya $ , pero systemd no trata $var y ${var} como el mismo. Ambos se reemplazan por el valor de entorno de var , pero la división de palabras será diferente en cada caso :con $var , después de reemplazar el valor de var , las palabras se dividirán en espacios en blanco, mientras que con ${var} no habrá división de palabras. Efectivamente, systemd trata $var como lo haría un shell POSIX, pero trata ${var} como un shell POSIX trataría "$var" .
Когда initramfs очистит все файлы, которые она запускает, переключите _root , что удалит все файлы, КРОМЕ папок :/proc, /dev, /sys и /run. Возможно, в одной из этих папок можно создать специальный файл, но это связано с хитростью.
См.:Можно ли создать каталог и файл внутри /proc/sys?
Конечно, проще всего просто добавить сценарий для записи переменной в файловую систему после загрузки корневой файловой системы, но до запуска инициализации. Это будет в папке «локальная -нижняя ». Есть ли причина, по которой вы не можете этого сделать?
Это просто. Посмотри в фстабе. Затем смонтируйте корневое устройство и запишите свою переменную в файл на смонтированном корневом устройстве. Я узнал об этом из kdump.