2013-10-03 53 views
0

請大家幫忙建議如何使用bash來捕獲子進程的stdout並將字符發送到子進程的stdin。bash腳本,使用stdin/stdout控制進程

例如,使用bash來控制10個視頻通過的ffmpeg過程轉換,bash的代碼需要看每個ffmpeg的進程的stdout然後決定是否發送標準輸入命令[+]/[-]/[c]/[q]或其他命令來控制的ffmpeg

隱蔽工作可能會像

ffmpeg -i INPUT_n -c copy -f flv out_n.flv 2>&1 | grep "[MY_PATTERN]" 

只有當[MY_PATTERN]出現這種作業顯示字上它的標準輸出。 我想使用bash代碼來捕捉工作的stdout,根據包含MY_PATTERN的行做一些決定,然後將命令提交到作業的stdin。 我想我需要通過bash來激活新shell來執行作業並與其stdin/stdout進行交互。但如何?

+0

該示例現在不僅表達了退出操作,還表達了取決於MY_PATTERN的其他操作 – Yehudi

回答

0

如果我理解正確的問題,您需要使用grep -q "MY_PATTERN"。一旦模式匹配,這將會發送一個SIGPIPEffmpeg進程。

以下應爲你工作:

ffmpeg -i INPUT_n -c copy -f flv out_n.flv 2>&1 | grep -q "[MY_PATTERN]" && some_command 

some_command將盡快模式匹配執行。

+0

感謝您的回覆,對我而言,此解決方案有兩個問題。首先,MY_PATTERN可能是一個正則表達式,需要進行以下檢測並在bash中選擇大小寫。其次,通過在標準輸入 – Yehudi

+0

中輸入[q]來停止ffmpeg,此解決方案在ffmpeg完成時將執行some_command,但我試圖實現的目的是停止ffmpeg – Yehudi

+0

@Yehudi您是否嘗試過?如上所述,這將向'ffmpeg'發送'SIGPIPE'。一旦發現模式,就應該停止它。 – devnull