Por que o 'diálogo' não exibe o menu (mas aceita aceitação) quando iniciado através de uma expressão de substituição de comando?

3

Eu quero, de um script de shell bash, apresentar ao usuário um menu de opções para escolher. A seleção deve então ser armazenada em uma variável de ambiente para posterior uso posterior.

Se eu correr na linha de comando:

dialog \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice"

então tudo funciona bem; Eu recebo o menu que eu quero, e choice1 ou choice2 é impresso de volta para mim. No entanto, se em vez disso eu corro:

SELECTION=$( dialog \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice" \
)

então ele não funciona mais do jeito que eu quero.

  • Nenhum menu é exibido, embora (até onde eu saiba) dialog sair quando eu pressionar Enter
  • Quando saio do menu não exibido pressionando Enter, a tag da seleção aparece no terminal em vez de ser armazenada em $ SELECTION

Eu tentei adicionar 2>&1 para redirecionar o stderr para o stdout, caso ele realmente estivesse sendo impresso no stderr. O único efeito perceptível disso é que agora, nada é retornado, seja da expressão de substituição de comandos ou impressa no terminal.

No meu sistema, dialog é cdialog 1.1-20120215. A página dialog man diz sobre --menu que Ao sair, a tag da entrada de menu escolhida será impressa na saída da caixa de diálogo. Isto parece que deve funcionar bem com algo como o acima, mas não para mim.

Eu quero que o menu seja exibido, permitindo que o usuário escolha entre as opções disponíveis e, quando o usuário aceitar, a tag (por exemplo, choice2 ) para a escolha selecionada ser armazenado na variável de ambiente $ SELECTION. Se o usuário cancelar, deve haver uma indicação clara de que (idealmente, $ SELECTION seria indefinido ou uma string de comprimento zero).

Como posso fazer isso? Que pedaço do quebra-cabeça estou faltando?

Soluções sugerindo alternativas para dialog também são aceitáveis, desde que apresentem um menu interessante para escolher e, idealmente, o software sugerido não seja muito exótico (a disponibilidade no repositório% Stable main do Debian é um requisito).

    
por a CVn 05.11.2014 / 20:45

1 resposta

6

Tente com a opção --stdout :

$ SELECTION=$( dialog --stdout \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice" \
)
    
por 05.11.2014 / 20:54

Tags