为何Bash脚本中whiptail获取输入后输出为空?求排查解决
问题
我尝试编写如下Bash脚本:
#!/bin/bash readonly bkp_path="x01/trdprod" bkp_location=" " bkp_dir=" " function crt_bkp_dir(){ bkp_dir=$(whiptail --title "Test" --inputbox "Insert backup directory name" 10 100\ --ok-button "Create" 3>&1 1>&2 2>&3) bkp_location="$bkp_path/$bkp_dir" } function main(){ crt_bkp_dir echo $bkp_location } main
我期望输出结果为x01/trdprod/test,但实际得到空输出。补充说明:我使用whiptail程序展示对话框并获取用户输入,在crt_bkp_dir函数内执行echo $bkp_location能得到预期值,但在main函数中无法得到正确结果。请问我哪里出错了?该如何修正?
原因分析
问题出在whiptail的重定向逻辑上。whiptail是基于ncurses的工具,它会把对话框界面输出到标准错误(stderr),用户输入需要通过标准输出(stdout)返回。你当前写的3>&1 1>&2 2>&3重定向写法有误,导致$(...)无法正确捕获用户输入,最终bkp_dir为空值,bkp_location变成x01/trdprod/,echo输出时看起来就是空内容。
修正方案
核心是让whiptail的对话框输出到终端,同时让用户输入被$(...)正确捕获,有两种可行写法:
写法一:直接重定向到终端
function crt_bkp_dir(){ bkp_dir=$(whiptail --title "Test" --inputbox "Insert backup directory name" 10 100 --ok-button "Create" 2>&1 >/dev/tty) bkp_location="$bkp_path/$bkp_dir" }
写法二:修正文件描述符交换逻辑
function crt_bkp_dir(){ bkp_dir=$(whiptail --title "Test" --inputbox "Insert backup directory name" 10 100 --ok-button "Create" 3>&1 1>&2 2>&3 3>&-) bkp_location="$bkp_path/$bkp_dir" }
两种写法都能让bkp_dir正确获取用户输入,进而生成预期的bkp_location路径,在main函数中正常输出。
内容的提问来源于stack exchange,提问作者ashen25
相关产品推荐
相关产品推荐

