在bash脚本中回显linux对话框的输出

时间:2015-05-27 09:34:38

标签: bash output

我正在开发一个简单的bash脚本菜单,我已经跟着this guide开始了。

它工作正常,但我不太喜欢将stderr重定向到文件然后在主循环中使用。

在我的脚本中,我有一些功能可以绘制不同的东西。我正在尝试修改它们而不必写入文件。绘制菜单的功能之一看起来像是(简化):

function render_menu()
{
    dialog --clear --backtitle "$backtitle" --title "Some Title" --menu "My  fancy menu" 50 15 4 "one" "option 1" "two" "option 2"
    echo $?
}

它从主循环调用,如:

while true; do
    selection="$(render_menu)" 

    case $selection in
            Quit) break;;
            Back) #some logic;;
            *) #some logic;;
    esac
done

但它不起作用,当我运行脚本时,我看不到菜单。我假设因为dialog的输出已被重定向?

我希望它工作的方式是显示对话框,其输出存储在变量selection中。这可能不需要外部文件吗?如果没有,为什么呢?

1 个答案:

答案 0 :(得分:0)

尝试:

#!/bin/bash
#

function render_menu()
{
  exec 3>&1
  selection=$(dialog --clear --backtitle "$backtitle" --title "Some Title" --menu "My  fancy menu" 50 15 4 "one" "option 1" "two" "option 2" 2>&1 1>&3)
  exit_code=$?
  exec 3>&-
}

render_menu 
echo $exit_code
echo $selection

*附录1 *

如果由于某种原因,必须将函数调用为$()并返回stdout中的结果,这是另一种可能性:

#!/bin/bash 
#

function render_menu()
{
   selection=$(dialog --clear --backtitle "$backtitle" --title "Some Title" --menu "My  fancy menu" 50 15 4 "one" "option 1" "two" "option 2" 2>&1 1>&3)
  exit_code=$?
   echo $selection
}

exec 3>&1
selection="$(render_menu  2>&1 1>&3)"
exec 3>&-
echo $selection