Opções dinâmicas no whiptail não foram impressas

0

Eu tenho um arquivo json que fornece opções para uma caixa de seleção 'whiptail' ou radiolist. Eu agarro, faço algumas redações e quero usá-las para mostrar como opções:

defaults.json file:

{"displays":
  [
    {"id": "320x240", "default":"on", "description":"320x240 (native resolution of 3.2 TFT-Display)", "hdmi_group":"2", "hdmi_mode":"87","hdmi_cvt":"320 240 60 1 0 0 0"},
    {"id": "640x480", "default":"off", "description":"640x480", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "720x540", "default":"off", "description":"720x540", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "800x600", "default":"off", "description":"800x600", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "1024x768", "default":"off", "description":"1024x768", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "1280x720", "default":"off", "description":"1280x720 (16:9)", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "1600x900", "default":"off", "description":"1600x900 (16:9)", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"},
    {"id": "1920x1080", "default":"off", "description":"1920x1080 (16:9)", "hdmi_group":"2","hdmi_mode":"87", "hdmi_cvt":"3240 240 60 1 0 0 0"}
  ]
} 

O script jq

displays=$(cat defaults.json | jq -r -j '.displays[] | "\(.id) \"\(.description)\" \(.default) "')

que me fornece a seguinte saída (que funciona quando eu o colo diretamente na [tag item status] position:

320x240 "320x240 (native resolution of 3.2 TFT-Display)" on 640x480 "640x480" off 720x540 "720x540" off 800x600 "800x600" off 1024x768 "1024x768" off 1280x720 "1280x720 (16:9)" off 1600x900 "1600x900 (16:9)" off 1920x1080 "1920x1080 (16:9)" off

Este funciona perfeitamente:

whiptail --title "Display setup" --radiolist  "Choose your display" 20 78 8 320x240 "320x240 (native resolution of 3.2 TFT-Display)" on 640x480 "640x480" off 720x540 "720x540" off 800x600 "800x600" off 1024x768 "1024x768" off 1280x720 "1280x720 (16:9)" off 1600x900 "1600x900 (16:9)" off 1920x1080 "1920x1080 (16:9)" off 3>&1 1>&2 2>&3

MAS quando tento adicioná-los por meio da variável $displays , whiptail apenas exibe o arquivo "help".

Isso não está funcionando

whiptail --title "Display setup" --radiolist  "Choose your display" 20 78 8 $displays 3>&1 1>&2 2>&3

O que estou fazendo errado, por que isso não está funcionando?

    
por Jan 03.11.2018 / 11:20

1 resposta

0

Isso porque a variável $displays será simplesmente dividida em espaço em branco (com o valor padrão da variável IFS ), sem se preocupar com as cotações e tal ( "1920x1080 (16:9)" será passado para whiptail como dois argumentos , "1920x1080 e (16:9)" , não como um único argumento contendo 1920x1080 (16:9) . Em casos como esse, recomendo vivamente usar set -x para descobrir quais argumentos são realmente passados para os comandos.

Tente isso:

jq -r '.displays[]|.id,.description,.default|@sh' defaults.json |
   xargs whiptail --title "Display setup" --radiolist  "Choose your display" 20 78 8

whiptail parece sempre usar stdout como o identificador para o terminal, portanto, se usado em uma substituição de comando, algo um pouco mais complexo é necessário:

res=$(jq -r '.displays[]|.id,.description,.default|@sh' defaults.json |
   xargs whiptail --output-fd 3 --title "Display setup" --radiolist  "Choose your display" 20 78 8 3>&1 >/dev/tty)
echo "$res"
    
por 03.11.2018 / 13:31