채찍 꼬리의 동적 옵션이 인쇄되지 않음

채찍 꼬리의 동적 옵션이 인쇄되지 않음

"whiptail" 확인란이나 라디오 목록에 대한 옵션을 제공하는 json 파일이 있습니다. 나는 그것들을 잡고, 약간의 편집을 하고, 그것들을 사용하여 옵션으로 표시하고 싶었습니다:

defaults.json문서:

{"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"}
  ]
} 

jq스크립트

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

[tag item status]그러면 다음과 같은 출력이 제공됩니다(해당 위치 에 직접 붙여넣으면 작동함 ).

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

이것은 훌륭하게 작동합니다:

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

하지만변수를 통해 추가하려고 하면 $displays" whiptail도움말" 파일만 출력됩니다.

이건 작동하지 않아

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

내가 뭘 잘못하고 있고 왜 작동하지 않습니까?

답변1

$displays이는 변수가 IFS따옴표에 신경 쓰지 않고 (변수의 기본값을 사용하여) 단순히 공백으로 분할되기 때문입니다 . 즉, ( "1920x1080 (16:9)"는 포함된 단일 인수가 아닌 두 개의 인수로 전달되고, 는 인수로 전달됩니다. 이 경우에는 실제로 명령에 전달되는 매개변수를 확인하려면 를 사용하는 것이 좋습니다.whiptail"1920x1080(16:9)"1920x1080 (16:9)set -x

이 시도:

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

whiptailstdout은 항상 터미널에 대한 핸들로 사용되는 것 같으므로 명령 대체에 사용되는 경우 더 복잡한 것이 필요합니다.

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"

관련 정보