2017-10-20 111 views
0

随着关于重定向shell流的所有问题和答案,我很惊讶我张贴我自己的一个,但我似乎无法找到任何东西类似的在线。外壳重定向:命令不会输出到标准输出或标准错误

为了简单描述我的情况,我正在尝试编写一个bash脚本,它将运行特定的二进制应用程序并监视特定字符串的输出,以便它可以对它们起作用。

我能够通过测试脚本来实现所需的功能,该测试脚本支持我的二进制应用程序。然而,当对真实的东西跑,它似乎并没有捕获所有的输出。当我独自运行的二进制应用程序,它输出这样

status OK 
something A 
something B 
... 
something Z 
status OK 
something A 

但是,当我尝试将此输出重定向进行分析,我只得到了“状态OK”线。中间所有的好东西都没有。即使我尝试使用>将其重定向到文件,情况也是如此。起初我认为它可能会在标准输出上放置“状态”,在标准输出上放置“某些东西”,但似乎并非如此。

如果这个应用程序能够输出东西到终端,我可以读取,我怎么不能捕获它?有没有可能格式化是奇怪的,以至于它被终端显示器正确解释,但不知何故,不通过任何类型的重定向?

任何有识之士将不胜感激!

+0

请看看[如何创建最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)。将您的代码添加到您的问题。 – Cyrus

+1

这真的取决于二​​进制应用程序在做什么。它可能会将输出发送到/ dev/tty。它可能会检查标准输出和/或标准错误以查看它们是否是终端设备。它可能...几乎可以做任何事情。 –

+0

@Cyrus由于法律原因,我无法发布确切的代码,但是,重要的细节隐藏在二进制应用程序中,我没有源代码。我的问题主要是了解应用程序可以通过>或2>方式将文本输出到终端的可能方式。但是,我知道这是一个相当开放的问题。 – Matt

回答

0

@戈登戴维森是对的钱。它看起来输出是直接发送到/ dev/tty,这显然是人们做的事情......谢谢,戈登!

更新:经过进一步的修补和其他人的输入,它看起来像是使用script捕获所有输出的重要部分。额外的重定向(即2>&1)不是必需的,但可以根据需要完成。继续在下面看看它的行动。

这里是我的基本代码:

二进制应用程序,将数据发送到/ dev/tty的被称为“binApp”,并假设它需要的命令行参数的任意数目。我的包装/观察家脚本将binApp及其所有ARGS运行,像这样:

WrapScript binApp arg1 arg2 ... argn

WrapScript:

#!/bin/bash 

args=("[email protected]") 
cmd=`echo "${args[@]:0}"` 

run() { 
    script -q -c "$cmd" 2>&1 | while read -r line; do 
     if [ "$line" = "$badthing" ]; then 
      echo "restarting..." 
      break 
     fi 
     echo "$line" 
    done 
} 

badthing="ERROR" 

while true; do 
    run 
    sleep 0.5 
done 

sleep 0.5允许用户按 “Ctrl + C” 两次退出。

+0

你的定义以'{'开始,并以'done'结尾 - 这肯定是不对的。并考虑避免使用'function'关键字来支持符合POSIX的函数定义语法,该语法只是'run(){'不具有'function'前面的;这样你的代码就可以与更广泛的shell一起工作。 –

+0

@CharlesDuffy好,赶快,谢谢。 – Matt

0

而不是/dev/null>&1你应该把2>&1。这将把stderr重定向到标准输出,你会以任何方式看到你将运行它。

+0

出于某种原因,我认为'/ dev/null>&1'是使这一切工作的神奇的子弹,但我尝试了'2&1'以及不使用任何重定向,他们似乎都工作!看起来好像是'脚本',它正在完成所有的工作。谢谢! – Matt

相关问题