外壳重定向:命令似乎不会输出到标准输出或标准输出



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

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

我能够通过一个测试脚本来实现所需的功能,这个脚本是我的二进制应用程序的替代品。然而,当与真实的东西运行时,它似乎并没有捕获所有输出。当我单独运行二进制应用程序时,它会输出这样的

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

但是,当我试图重定向此输出进行分析时,我只得到"status OK"行。介于两者之间的所有好东西都不见了。即使我试图将其重定向到带有>的文件,这也是正确的。起初,我认为它可能会在stdout上显示"status",在stderr上显示"something",但事实并非如此。

如果这个应用程序能够将我可以阅读的内容输出到终端,我怎么不能捕获它呢?格式化是否可能很奇怪,以至于终端显示器可以正确地解释它,但不知何故,任何类型的重定向都不能解释它?

任何见解都将不胜感激!

@Gordon Davisson说得对。输出似乎被直接发送到/dev/tty,这显然是人们所做的事情…谢谢,Gordon!

更新:经过进一步的修补和其他人的输入,看起来重要的部分是使用script来捕获所有输出。不需要额外的重定向(即2>&1),但如果需要,可以进行重定向。请在下面继续查看它的实际操作。

这是我的基本代码:

将数据发送到/dev/tty的二进制应用程序称为"binApp",假设它接受任意数量的命令行参数。我的包装器/观察者脚本将与binApp及其所有参数一起运行,如下所示:

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"退出。

应该放/dev/null>&1而不是2>&1。这将把stderr重定向到stdout,您将在运行它的任何方式中看到这两者

最新更新