You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:06:12