2009-11-11 48 views
10

我正在動態地在bash中構造一個命令。這工作得很好:在bash中動態構建一個命令

COMMAND="java myclass" 
${COMMAND} 

現在我要動態地構建redirectes輸出命令:

LOG=">> myfile.log 2>&1" 
COMMAND="java myclass $LOG" 
${COMMAND} 

的命令仍然調用java程序,但輸出不重定向到myfile.log

此外,如果我做的:

BACKGROUND="&" 
COMMAND="java myclass $BACKGROUND" 
${COMMAND} 

該命令不在中運行他的背景。

關於如何獲取日誌重定向和背景位工作的任何線索? (bash的-x示出被構造的命令如預期)

(在現實中,不象本實施例中,LOG和背景的值被動態地設定)

回答

4

它不起作用,因爲引號禁用的特殊含義>&。您必須執行實現shell的這些功能的命令。

要重定向,請在要記錄的命令前撥打exec >> myfile.log 2>&1

要在後臺運行程序,請使用nohupnohup cmd args...)。

+0

感謝您的解釋。 – Joel 2009-11-11 14:52:02

12

您可以與eval命令做到這一點:

eval ${COMMAND} 
+4

請注意,如果命令的參數需要引號,'eval'可能會中斷。 – 2009-11-11 14:59:35

+0

我結束了使用這個答案 - 但我標記亞倫是正確的,因爲它稍微更完整...希望我可以標記他們都正確。 – Joel 2009-11-11 15:23:11

12

eval你想要做什麼。

#!/bin/bash 

CMD="echo foo" 
OUT="> foo.log" 
eval ${CMD} ${OUT} 


CMD="sleep 5" 
BG="&" 
eval ${CMD} ${BG}