2013-03-28 206 views
1

我试图运行一个应用程序(比如说top),以便它从stdin的文件读取并从stdout写入另一个文件。Bash:从文件读取stdin并将stdout写入文件

目前我有

mkfifo stdin.pipe 
(tail -f stdin.pipe) | top 

预期其工作,我可以再echo东西的文件,上面会接受它。 但我无法重定向顶部的输出。 我该如何做到这一点?

编辑:

好吧,让我们从头开始。 我这个测试:

cat test.sh 

echo Say something 
read something 
echo you said $something 
+0

你确定'top'是从'stdin'读取的吗?我的不是。您可以使用'-b'(batch)选项从'top'重定向输出:'top -n 1 -b> gash' – cdarke 2013-03-28 11:35:36

+0

@cdarke对不起,您是对的。我正在用另一个应用程序进行测试。顶部不以相同的方式工作。有没有一种方法可以将stdin和stdout映射到文件并使用它们来控制cli应用程序? – alexandernst 2013-03-28 11:38:17

回答

13

让我们忘掉top,这似乎是一个红色的鲱鱼。

要映射标准输入和标准输出到文件,您可以使用重定向:

some_program < input_file   # Redirects stdin 

another_program > output_file  # Redirects stdout 

甚至:

yet_another <input_file> output_file 
+0

这是异步还是同步?我只是用2行bash测试它会说“嗨”,等待输入,然后说“再见”。在我将输入文件重定向到input_file后,我能够看到输出文件中的输出(也就是说,当应用程序运行完毕后) – alexandernst 2013-03-28 11:48:21

+0

如果您在程序之间通信,那么使用匿名管道,这比使用临时文件更有效。在这种情况下,取决于sync/async的含义,但是所有的shell IO都被缓存了。刷新缓冲区并在每次重定向之后关闭文件,但是如果程序在写入时正在读取(到文件而不是管道),则可能会出现问题。 – cdarke 2013-03-28 13:23:31

+0

问题是我试图从PHP控制一个CLI应用程序,所以我无法将句柄保存到管道,这就是为什么我需要能够读取/写入/从文件。我如何强制输出被刷新而不是缓冲? – alexandernst 2013-03-29 02:33:53

3

有没有一种方法,我可以映射标准输入和标准输出文件和使用他们控制一个cli应用程序?

听起来好像您在寻找coprocesses,在4.0中添加到Bash。

coproc cat     # Start cat in background 
echo Hello >&${COPROC[1]}  # Say "Hello" to cat 
read LINE <&${COPROC[0]}  # Read response 
echo $LINE     # cat replied "Hello"! 

在4.0之前,你必须使用两个命名管道来实现这一点。