"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
whiptail
stdout은 항상 터미널에 대한 핸들로 사용되는 것 같으므로 명령 대체에 사용되는 경우 더 복잡한 것이 필요합니다.
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"