2013-03-28 197 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之前,你必須使用兩個命名管道來實現這一點。

相關問題