2017-06-12 75 views
0

不知何故,我沒有找到足夠的答案來解決我的問題,只有部分hackarounds。STDOUT&STDERR從前一個命令作爲下一個命令的參數

我正在調用一個單獨的「chained」shell命令(從一個Node應用程序),它啓動一個長時間運行的更新過程,它的stdout/-err應作爲參數移交給第二部分shell命令(另一個登錄到數據庫的Node應用程序)。

我想要做這樣的事情:

updateCommand 2>$err 1>$out ; logDBCommand --log arg err out 
  • 不能使用>,因爲它是隻對文件或文件描述符。
  • 另外,如果我使用shell變量(如error=$({ updateCommand | sed 's/Output/tmp/'; } 2>&1); logDBCommand --log arg \"${error}.\"),我只能有stdout或混合成一個參數。
  • 而且我不想管道,因爲第二個命令(logCommand)應該運行,無論第一個命令執行成功還是失敗。
  • 我不想高速緩存文件,使誠實是缺少點並引入另一個異步誤差矢量
  • 列表項
+1

如何將緩存到文件導致異步錯誤? – 123

+0

使用管道,雙方同時運行,儘管如果一端關閉,任何一方都可能在SIGPIPE上退出,但是如果你的logCommand處理得很好,儘管用管道解決stdout和stderr仍然很困難 –

+0

@ 123,明顯地結束了一個程序的文件寫入和稍後拾取它是異步的,並且有一個額外的磁盤寫入缺少了這一點,並不是重點(並且可以,並不是說最終會造成問題) –

回答

0

經過#!/bin/bash人聊上幾句建議只使用tpmsf(文件系統保存在RAM中),這是第二個最優雅(但唯一可能)的方式來做到這一點。所以我可以使用>運算符,並將stdoutstderr分別放在內存中的變量中。

command1 >/dev/shm/c1stdout 2>/dev/shm/c1stderr 
A=$(cat /dev/shm/c1sdtout) 
B=$(cat /dev/shm/c1stderr) 
command2 $A $B 

(或更短):

A=$(command1 2>/dev/shm/c1stderr) 
B=$(cat /dev/shm/c1stderr) 
command2 $A $B 
相關問題