【问题标题】:Echo output of linux dialog utlity in bash scriptbash脚本中linux对话实用程序的回显输出
【发布时间】:2015-05-27 09:34:38
【问题描述】:

我正在开发一个简单的 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 中。这可能不需要外部文件吗?如果不是,为什么会这样?

【问题讨论】:

  • 分配给变量的命令的所有输出都放在该变量中。 Selection 将包含返回码和对话框的全部内容。

标签: bash output


【解决方案1】:

试一试:

#!/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 ***

如果由于某种原因该函数必须被调用为 $(render_menu ...) 并在标准输出中返回结果,这是另一种可能性:

#!/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

【讨论】:

  • 这不是我想要的。我更喜欢编写我的脚本,以便函数回显一个值,然后我只使用命令扩展将它放入一个变量中。也许我应该更清楚我想按原样离开循环并修改 render menu function only
  • 这些是相同答案的次要变体。已更新,请随时提供您自己的变体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多