2012-03-01 8 views
11

estoy teniendo cotizaciones de dificultad anidada dentro de una escritura del golpecotizaciones Bash anidados y eval

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

Lo anterior me consiguió

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

Respuesta

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

No estoy seguro de que el enlace que proporcionó discuta su uso sugerido de matrices de bash. –

+0

@TomHale: Mi respuesta tenía un error de sintaxis. –

9

Eso es porque \' doesn' t tiene un significado especial dentro de una cadena de una sola cita; significa simplemente "barra invertida, seguida por el final de la cadena".

Una opción es usar $'...' en lugar de '... '; eso te permitirá usar backslash-escapes. Se vería así:

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

La desventaja es que si hay alguna posibilidad de que $RVM_PATH, $config_rvm, o cualquiera de las otras variables podrían incluir una barra invertida, entonces también podría interpretarse como la introducción de una barra invertida-escape.