Shell重定向:命令似乎不会输出到stdout或stderr

时间:2017-10-20 05:36:23

标签: bash

关于重定向shell流的所有问题和答案,我很惊讶我发布了自己的一个,但我似乎无法在网上找到类似的东西。

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

我能够通过一个代表我的二进制应用程序的测试脚本来实现所需的功能。但是,当与真实事物竞争时,它似乎并不捕获所有输出。当我单独运行二进制应用程序时,它会按原样输出

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

但是当我尝试重定向此输出进行分析时,我只获得“状态正常”行。中间所有好东西都缺席了。即使我尝试将其重定向到带有>的文件,也是如此。 。起初我以为它可能会将“状态”放在stdout上,而“某些东西”放在stderr上,但情况似乎并非如此。

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

非常感谢任何见解!

2 个答案:

答案 0 :(得分:0)

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

更新:在进一步修改并从其他人那里输入后,看起来重要的部分是使用script来捕获所有输出。不需要额外的重定向(即2>&1),但如果需要可以进行。继续下面看看它的实际效果。

这是我的基本代码:

将数据发送到/ dev / tty的二进制应用程序称为' binApp',并且假设它需要任意数量的命令行参数。我的包装器/观察器脚本将使用binApp及其所有args运行,如下所示:

WrapScript binApp arg1 arg2 ... argn

WrapScript:

#!/bin/bash

args=("$@")
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"两次退出。

答案 1 :(得分:0)

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