Algo errado com espaços no zenity tentando em um script [duplicado]

1

Enquanto isso é executado diretamente no terminal funciona bem

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

Mas este roteiro não funciona o que está errado?

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

O script é exibido como: "info in text and '" jeevan in title. Está pulando a parte restante.
É porque o espaço (caractere especial) perde seu significado especial entre aspas duplas?

    
por jeevanreddymandali 14.07.2015 / 10:15

2 respostas

1

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>     

por 14.07.2015 / 10:36
1

Uma solução para este problema é eval uate a expressão inteira para que as aspas dentro da string sejam analisadas:

eval zenity "$ZEN"

A propósito, você também pode usar aspas simples em definição de variável em vez de aspas duplas:

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

E BTW2, você perdeu # na frente de !/bin/bash .

Se você estiver usando zsh, um método alternativo é dividir o parâmetro em palavras usando a análise de shell (levando em consideração as citações) com z flag, ou seja:

zenity "${(z)ZEN}"
    
por 14.07.2015 / 10:37