【发布时间】:2011-10-10 02:53:09
【问题描述】:
我有一个小程序,我们简单地称它为“程序”,它具有“正常”的行为。它从标准输入(通常由用户在键盘上输入)获取信息并通过标准输出/标准错误输出。我想自动化一个过程,因此将 stdout/stderr 重定向到“我的小 bash 脚本”(它也可能是 C/C++ 中的另一个程序)。它将它作为标准输入并对其进行过滤。这意味着忽略不重要的信息......并添加由 bash 脚本本身生成的更多信息。输出显示在屏幕上(由 echo 命令打印出来)。
到目前为止这是有效的:
program --verbose 2>&1 | ./mylittlebashscript.sh
方案:
stdin +---------------+ +---------------+
--------->| |--stdout--+-->| my |-->screen
| program | | | little |
| |--stderr--| | bash script |
+---------------+ +---------------+
现在我想更进一步: 该程序需要来自用户的输入,我想通过我的小 bash 脚本自动提供这些输入。例如,它提示用户输入特定文件的路径。我的小 bash 脚本知道该路径,并且 bash 脚本知道程序何时等待输入(因为打印出来的最后一行包含“greped”的内容)。如何从我的 bash 脚本中返回 一些 信息?我不想通过管道返回所有的标准输出,因为只需要在屏幕上显示几个信息,程序不会喜欢这个输出。
新方案:
(stdin?) +---------------+ +---------------+ (stdout?)
-------+->| |--stdout--+-->| my |-->screen
| | program | | | little |
| | |--stderr--+ | bash script |----+(maybe
| +---------------+ +---------------+ | stderr?)
| |
+------------------------------------------------------+
目前我对 Linux 还不是很熟悉。我想有可能使用 cat、fifos、tee 和管道/重定向。不幸的是,到目前为止我还没有实现它。
我真的很高兴有一个小例子! 非常感谢!
干杯 马蒂亚斯
PS:我认为这个线程是相关的:how to redirect stdout of 2nd process back to stdin of 1st process?
编辑: 好的,为了更进一步的解释,我从我的测试机器上拿了我的测试文件:
我将“程序”替换为另一个名为 input.sh 的批处理文件:
#!/bin/bash
echo "input.sh: give me input, waiting for input 1"
read x
echo $x
echo "input.sh: give me input, waiting for input 2"
read x
echo $x
我得到了第二个(“mylittlebashscript.sh”),现在称为 inter.sh 来处理:
#!/bin/bash
echo "inter.sh: start"
while read line ; do
echo "inter.sh: line>$line"
notfound=$(echo $line | grep "waiting")
if [[ "$notfound" ]]; then
echo "inter.sh: input sh seems to wait for input! putting something in the fifo"
#echo "banana" > testfile
#echo "I am the stderr" >&2
fi
done
echo "inter.sh: end"
exit
【问题讨论】:
标签: bash stdout pipe stdin stderr