Escapando um comando linux

1

Estou tentando executar um comando a partir de um script que eu escrevi que basicamente substitui uma string no arquivo

vzctl exec VZID sed -i 's/\/>/address="$IP\/255.255.255.0"\/\>/' "file.xml"

O problema é que o comando perde o ' e "

existe uma forma de escapar do comando para preservar os ' e " ? ou de alguma forma encapsulando isso?

    
por Amit 14.08.2015 / 13:19

2 respostas

2

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á . Para isso, você precisaria:

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"
    
por 14.08.2015 / 13:33
0

Você tentou agrupar o comando inteiro entre aspas e espace o interno com barras invertidas?

Quero dizer:

vzctl exec VZID 'sed -i \'s/\/>/address=\"$IP\/255.255.255.0\"\/\>/\' \"file.xml\"'

Eu também verificaria aspas duplas se o single não funcionasse, mas acho que deveria.

    
por 14.08.2015 / 13:33