Presumivelmente, esse vzctl exec
funciona como eval
. Isto é, ele constrói uma linha de comando shell a partir da concatenação dos argumentos que recebe. Portanto, você deve passar uma linha de comando shell válida como argumento, o que significaria outro nível de cotação.
vzctl exec VZID '
sed -i '\''s/\/>/address="$IP\/255.255.255.0"\/\>/'\'' "file.xml"'
Observe que $IP
não será
vzctl exec VZID '
sed -i '\''s/\/>/address="'"$IP"'\/255.255.255.0"\/\>/'\'' "file.xml"'
Para que seja expandido pelo shell que interpreta o comando vzctl
ou:
vzctl exec VZID '
sed -i '\''s/\/>/address="'\''"$IP"'\''\/255.255.255.0"\/\>/'\'' "file.xml"'
Para que seja expandido pelo shell que vzctl exec
invoca (supondo que o shell tenha acesso a essa variável $IP
).
Note que pode ser mais fácil usar um documento aqui e armazenar esse código em uma variável para clareza como:
code=$(cat <<EOF
sed -i 's|/>|address="$IP/255.255.255.0"/>|' file.xml
EOF
)
(essa forma do documento aqui expande as variáveis (aqui $ID
)).
E corra como
vzctl exec VZID "$code"