Acabei de me esforçar para citar e executar a seguinte linha de comando na chave ExecStart
de um arquivo de unidade de serviço:
IFS=$'\n'; f=($(ls $HOME/bk.d/DuckieTV*.backup | tail -n +2)); echo "${f[@]}"
Vou citá-lo usando as regras de cotação do systemd e depois explicarei o que aprendi no processo. Parece complicado porque esperamos que ele siga as regras de cotação de shells POSIX, mas na verdade é ainda mais simples. Aqui está a diretiva ExecStart
, devidamente citada
ExecStart=/bin/bash -c 'IFS=$$\'\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\"'
ou
ExecStart=/bin/bash -c "IFS=$$\'\n\'; f=($$(ls ${HOME}/bk.d/DuckieTV*.backup | tail -n +2)); echo \"$${f[@]}\""
Então, as regras de cotação:
- Inclua a sequência a ser tratada como um único argumento entre aspas simples ( '' ) ou aspas duplas ( "" ). Eles são tratados da mesma forma, não importa qual você escolher, desde que a cotação de fechamento seja a mesma da cotação de abertura
- Analise a sequência da esquerda para a direita, substituindo ' por \' , " por \" e $ com $$
Se você quiser que o systemd faça substituições de variáveis, então não cite $ , mas o systemd não trata $ var e $ {var} como o mesmo. Ambos são substituídos pelo valor de ambiente de var , mas a divisão de palavras será diferente em cada caso: com $ var , após a substituição do valor de var , as palavras serão divididas em espaço em branco, enquanto que com $ {var} não haverá divisão de palavras. Efetivamente, o systemd trata $ var como um shell POSIX faria, mas trata $ {var} como um shell POSIX trataria "$ var" .