2012-07-18 74 views
1

我需要在bash中重定向stout和stderr,每個單獨的文件。 以及我完成了這個命令:一個bash腳本里面的三通和管道

 
    ((/usr/bin/java -jar /opt/SEOC2/seoc2.jar 2>&1 1>&3 | tee --append /opt/SEOC2/log/err.log) 3>&1 1>&2 | tee --append /opt/SEOC2/log/app.log) >> /opt/SEOC2/log/combined.log 2>&1 & 

從一個命令行工作正常運轉。

試圖把同樣的命令到bash腳本

 
... 
12 cmd="(($run -jar $cmd 2>&1 1>&3 | tee --append $err) 3>&1 1>&2 | tee --append $log) >> $combined 2>&1" 
... 
30     echo -e "Starting servis..." 
31     $cmd & 
32     pid=`ps -eo pid,args | grep seoc2.jar | grep -v grep | cut -c1-6` 
33     if [ ! -z $pid ]; then 
... 

導致錯誤這樣的:

 
    [email protected]:/opt/SEOC2# seoc2 start 
    Starting servis... 
    /usr/local/bin/seoc2: line 31: ((/usr/bin/java: dir or file doesn't exist 

試圖通過$(),``等,但來彌補這一命令完全沒有影響:(

任何建議或意見將非常感激,玩了幾個小時已經:/

感謝名單了很多 劉若英

+0

能否請您發佈的內容,你輸入在bash提示符下到* *調用**失敗的腳本,並顯示你從哪裏調用它(即當您厭倦運行腳本時,當前目錄是什麼) – 2012-07-18 13:52:45

+0

您是否需要在一個變量中使用整個管道?問題是引用的字符串會導致shell不將括號解釋爲shell語法,而是將其解釋爲字符串中的文字字符。最簡單的方法就是在第31行寫出命令。'eval $ cmd'可以工作,但*不推薦使用。 – chepner 2012-07-18 13:58:24

+0

@JoshGreife不是你在我最初的帖子的最後一個灰色框中要求什麼?即 skript位於/ opt/SEOC2 但應該能夠從任何地方運行 $ err,$ log,$ combined是在本示例中的/ opt/SEOC2/log/ 的絕對路徑位置,我從/ opt/SEOC2 – user1062331 2012-07-18 14:14:09

回答

2

如果您存儲在你必須使用eval執行它的變量整個命令行:

cmd="(($run -jar $cmd 2>&1 1>&3 | tee --append $err) 3>&1 1>&2 | tee --append $log) >> $combined 2>&1" 
... 
eval $cmd & 
+0

這個提示似乎工作得很好,雖然它生成像這樣的ps樹:

 15583 pts/0 S 0:00 /bin/bash /usr/local/bin/seoc2 start 15585 pts/0 S 0:00 \_ /bin/bash /usr/local/bin/seoc2 start 15586 pts/0 S 0:00 \_ /bin/bash /usr/local/bin/seoc2 start 15588 pts/0 Sl 1:41 | \_ /usr/bin/java -jar /opt/SEOC2/seoc2.jar 
但它不影響功能,它真的有效! 非常感謝。 R – user1062331 2012-07-18 14:29:24

+0

@ user1062331:這些額外的過程不是由'eval'引起的,而是由括號引起的。每個級別的'()'都會創建一個子shell。 – bmk 2012-07-18 14:38:46