Cómo ejecutar un comando bash almacenado como una cadena con comillas y asterisco

Intento ejecutar el siguiente comando:

mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" 

Lo guardo en una cadena:

 cmd="mysql AMORE -u username -ppassword -h localhost -e\"SELECT host FROM amoreconfig\"" 

Pruébalo :

 echo $cmd mysql AMORE -u username -ppassword -h localhost -e"SELECT host FROM amoreconfig" 

Intenta ejecutar haciendo:

 $cmd 

Y obtengo la página de ayuda de mysql:

 mysql Ver 14.14 Distrib 5.1.31, for pc-linux-gnu (i686) using readline 5.1 Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc. This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Usage: mysql [OPTIONS] [database] (...) 

Supongo que estoy haciendo algo completamente incorrecto con las citas, pero no puedo descubrir cuál es el problema.

Has probado:

 eval $cmd 

Para la siguiente pregunta sobre cómo escapar * ya que tiene un significado especial cuando está desnudo o en cadenas de comillas dobles: use comillas simples.

 MYSQL='mysql AMORE -u username -ppassword -h localhost -e' QUERY="SELECT "'*'" FROM amoreconfig" ;# <-- "double"'single'"double" eval $MYSQL "'$QUERY'" 

Bono: También se lee bien: eval mysql query 😉

Use una matriz, no una cadena, como se indica en la guía en BashFAQ # 50 .

Usar una cadena es una práctica de seguridad extremadamente mala : considere el caso donde la password (o una cláusula where en la consulta, o cualquier otro componente) es proporcionada por el usuario; no desea eval una contraseña que contenga $(rm -rf .) !


Simplemente ejecutando un comando local

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) "${cmd[@]}" 

Imprime tu comando inequívocamente

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf 'Proposing to run: ' printf '%q ' "${cmd[@]}" printf '\n' 

Ejecutando su comando sobre SSH (Método 1: Usando Stdin)

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf -v cmd_str '%q ' "${cmd[@]}" ssh other_host 'bash -s' <<<"$cmd_str" 

Ejecutando su comando sobre SSH (Método 2: Línea de comando)

 cmd=( mysql AMORE -u username -ppassword -h localhost -e "SELECT host FROM amoreconfig" ) printf -v cmd_str '%q ' "${cmd[@]}" ssh other_host "bash -c $cmd_str" 

prueba esto

 $ cmd='mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"' $ eval $cmd 

No necesitas el “eval” incluso. Simplemente ponga un signo de dólar delante de la cadena:

 cmd="ls" $cmd 

Para eliminar la necesidad de la variable cmd, puede hacer esto:

 eval 'mysql AMORE -u root --password="password" -h localhost -e "select host from amoreconfig"'