2017-10-20 54 views
0

隨着關於重定向shell流的所有問題和答案,我很驚訝我張貼我自己的一個,但我似乎無法找到任何東西類似的在線。外殼重定向:命令不會輸出到標準輸出或標準錯誤

爲了簡單描述我的情況,我正在嘗試編寫一個bash腳本,它將運行特定的二進制應用程序並監視特定字符串的輸出,以便它可以對它們起作用。

我能夠通過測試腳本來實現所需的功能,該測試腳本支持我的二進制應用程序。然而,當對真實的東西跑,它似乎並沒有捕獲所有的輸出。當我獨自運行的二進制應用程序,它輸出這樣

status OK 
something A 
something B 
... 
something Z 
status OK 
something A 

但是,當我嘗試將此輸出重定向進行分析,我只得到了「狀態OK」線。中間所有的好東西都沒有。即使我嘗試使用>將其重定向到文件,情況也是如此。起初我認爲它可能會在標準輸出上放置「狀態」,在標準輸出上放置「某些東西」,但似乎並非如此。

如果這個應用程序能夠輸出東西到終端,我可以讀取,我怎麼不能捕獲它?有沒有可能格式化是奇怪的,以至於它被終端顯示器正確解釋,但不知何故,不通過任何類型的重定向?

任何有識之士將不勝感激!

+0

請看看[如何創建最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。將您的代碼添加到您的問題。 – Cyrus

+1

這真的取決於二​​進制應用程序在做什麼。它可能會將輸出發送到/ dev/tty。它可能會檢查標準輸出和/或標準錯誤以查看它們是否是終端設備。它可能...幾乎可以做任何事情。 –

+0

@Cyrus由於法律原因,我無法發佈確切的代碼,但是,重要的細節隱藏在二進制應用程序中,我沒有源代碼。我的問題主要是瞭解應用程序可以通過>或2>方式將文本輸出到終端的可能方式。但是,我知道這是一個相當開放的問題。 – Matt

回答

0

@戈登戴維森是對的錢。它看起來輸出是直接發送到/ dev/tty,這顯然是人們做的事情......謝謝,戈登!

更新:經過進一步的修補和其他人的輸入,它看起來像是使用script捕獲所有輸出的重要部分。額外的重定向(即2>&1)不是必需的,但可以根據需要完成。繼續在下面看看它的行動。

這裏是我的基本代碼:

二進制應用程序,將數據發送到/ dev/tty的被稱爲「binApp」,並假設它需要的命令行參數的任意數目。我的包裝/觀察家腳本將binApp及其所有ARGS運行,像這樣:

WrapScript binApp arg1 arg2 ... argn

WrapScript:

#!/bin/bash 

args=("[email protected]") 
cmd=`echo "${args[@]:0}"` 

run() { 
    script -q -c "$cmd" 2>&1 | while read -r line; do 
     if [ "$line" = "$badthing" ]; then 
      echo "restarting..." 
      break 
     fi 
     echo "$line" 
    done 
} 

badthing="ERROR" 

while true; do 
    run 
    sleep 0.5 
done 

sleep 0.5允許用戶按 「Ctrl + C」 兩次退出。

+0

你的定義以'{'開始,並以'done'結尾 - 這肯定是不對的。並考慮避免使用'function'關鍵字來支持符合POSIX的函數定義語法,該語法只是'run(){'不具有'function'前面的;這樣你的代碼就可以與更廣泛的shell一起工作。 –

+0

@CharlesDuffy好,趕快,謝謝。 – Matt

0

而不是/dev/null>&1你應該把2>&1。這將把stderr重定向到標準輸出,你會以任何方式看到你將運行它。

+0

出於某種原因,我認爲'/ dev/null>&1'是使這一切工作的神奇的子彈,但我嘗試了'2&1'以及不使用任何重定向,他們似乎都工作!看起來好像是'腳本',它正在完成所有的工作。謝謝! – Matt

相關問題