Algo no funciona con espacios en zenity intentando en un script

Si bien esto se ejecuta directamente en la terminal, funciona bien

zenity --info --text "pure info" --title "get info" 

Pero este script no funciona, ¿qué sucede?

 !/bin/bash ZEN="--info --text \"pure info\" --title \"get info\"" zenity $ZEN 

El script genera como: "información en text y '" jeevan en el título. Se salta la parte restante.
¿Es porque el espacio (personaje especial) pierde su significado especial dentro de comillas dobles?

La diferencia es que el command zenity ve múltiples arguments en el primer caso, y solo uno (incluyendo muchos espacios) en el segundo.

Con el siguiente progtwig awk , puede generar rápidamente a qué el shell expande los arguments. zsh casualidad, zsh podría reproducir tu problema:

 % awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN ARGV[0] = awk ARGV[1] = --info --text "pure info" --title "get info" 

Mientras que en bash se ve casi como debería verse (note que las cadenas entre comillas están divididas en palabras):

 $ awk 'BEGIN {for (i in ARGV) print "ARGV["i"] =", ARGV[i]}' $ZEN ARGV[0] = awk ARGV[1] = --info ARGV[2] = --text ARGV[3] = "pure ARGV[4] = info" ARGV[5] = --title ARGV[6] = "get ARGV[7] = info" 

Debería haber una opción de split de palabras de shell responsable de este comportamiento.

Esto, sin embargo, funcionó:

 set -- --info --text "pure info" --title "get info" zenity "$@" 

Editar:

Las shells son un poco estúpidas con la split de palabras de manera pnetworkingeterminada, mira el comportamiento en mi ejemplo bash arriba: "pure and info" son dos palabras separadas. Como esto es molesto en el análisis de las opciones de command-line, se ha creado una funcionalidad especial en el tratamiento de "$@ . Citando el manual de bash , sección Parámetros especiales:

  @ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ... 

No he encontrado una manera de get el tratamiento especial de $@ en la expansión variable normal, pero podría haber un truco.

El command set establece los parameters posicionales, $1 , $2 , … Como tal, la opción "Darme todo", la versión de los parameters posicionales, $@ , también está disponible.

Una solución a este problema es evaluar la expresión completa para que se analicen las comillas dentro de la cadena:

 eval zenity "$ZEN" 

Por cierto, también puede usar comillas simples en la definición de variable en lugar de escaping de las comillas dobles:

 ZEN='--info --text "pure info" --title "get info"' 

Y BTW2, te falta # delante de !/bin/bash .

Si está usando zsh, entonces un método alternativo es dividir el parámetro en palabras usando el análisis de shell (teniendo en count las comillas) con el indicador z , es decir:

 zenity "${(z)ZEN}"