我有一個小程序,讓我們稱之爲「程序」,它具有「正常」行爲。它從stdin獲取信息(通常由用戶在鍵盤中輸入)並通過stdout/stderr打印出來。我想自動化一個進程,因此將stdout/stderr重定向到「我的小bash腳本」(也可能是C/C++中的另一個程序)。它將它作爲標準輸入並對其進行過濾。這意味着刪除不重要的信息..並添加由bash腳本本身生成的更多信息。輸出顯示在屏幕上(由echo命令打印出來)。bash - 將第二個腳本的特定輸出重定向回第一個程序的stdin?
這是工作迄今:
program --verbose 2>&1 | ./mylittlebashscript.sh
方案:
stdin +---------------+ +---------------+
--------->| |--stdout--+-->| my |-->screen
| program | | | little |
| |--stderr--| | bash script |
+---------------+ +---------------+
現在我想更進一步: 程序期望從中我想通過自動給用戶輸入我的小bash腳本。例如,它會提示用戶輸入特定文件的路徑。路徑由我的小bash腳本知道,bash腳本知道程序何時等待輸入(因爲要打印的最後一行包含「greped」)。如何將一些信息從我的bash腳本中退出?我不想回退所有的stdout,因爲只需要在屏幕上顯示幾個信息,程序就不會喜歡這個輸出。
新方案:
(stdin?) +---------------+ +---------------+ (stdout?)
-------+->| |--stdout--+-->| my |-->screen
| | program | | | little |
| | |--stderr--+ | bash script |----+(maybe
| +---------------+ +---------------+ | stderr?)
| |
+------------------------------------------------------+
在我不是很熟悉Linux卻時刻。我想有可能與貓,fifos,發球臺和管道/重定向工作。不幸的是,到目前爲止我還沒有實現它。
我真的很高興有一個小例子! 非常感謝!
乾杯 馬蒂亞斯
PS:我覺得這個線程相關:how to redirect stdout of 2nd process back to stdin of 1st process?
編輯: 好,爲fruther解釋我把我的測試文件從我的測試機:
我用另一批文件替換「程序」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
看起來很有趣。你用它嗎?不幸的是我找不到它的手冊頁。我想知道像f,w和s這樣的命令行參數。當您只輸入「空白」和「腳本」,「手動」或其他內容時,很難在搜索引擎上找到好的結果。但是,非常感謝! – matthias
好吧,只需輸入「空白」即可打印使用情況 - 這對我來說仍然很神祕。我試圖爲自己的input.sh bash腳本編寫自己的空腳本,但它失敗了:'empty:數據流是空的。關鍵詞未找到。超時退出.'。我在哪裏嘗試「等待」,「輸入」等幾件事情。 – matthias
取得了一些進展。我不知道我是否忘記了'chmod + x emptyscript.sh' ..另一個問題是,似乎我必須將'fifo_in和fifo_out'文件'rm -f'。 – matthias