A diferença é que o comando zenity
vê vários argumentos no primeiro caso e apenas um (incluindo muitos espaços) no segundo.
Com o seguinte programa awk
, você pode imprimir rapidamente para o que o shell expande os argumentos. Por acaso, zsh
eu consegui reproduzir o seu 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"
Considerando que em bash
parece quase como deveria parecer (note que as strings entre aspas são divididas em palavras):
$ 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"
Deve haver uma opção de divisão de palavras da shell responsável por esse comportamento.
Isso, no entanto, funcionou:
set -- --info --text "pure info" --title "get info"
zenity "$@"
Editar:
Os shells são um pouco idiotas com a divisão de palavras por padrão, veja o comportamento no meu bash
exemplo acima: "pure
e info"
são duas palavras separadas. Como isso é irritante na análise de opções de linha de comando, alguma funcionalidade especial foi criada no tratamento de "$@
. Citando o bash
manual, seção Parâmetros especiais:
@ 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" ...
Não encontrei uma maneira de obter o tratamento especial de $@
na expansão de variável normal, mas pode haver um truque.
O comando set
define os parâmetros posicionais, $1
, $2
, .... Como tal, a versão "Give me all" de parâmetros posicionais, $@
, também está disponível. / p>