在bash中动态构建命令

24

我正在动态构建一个Bash命令。这很好用:

COMMAND="java myclass"
${COMMAND}

现在我想动态构建一个命令,将输出重定向:

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

该命令仍会调用java进程,但输出不会重定向到myfile.log文件。

此外,如果我执行:

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

该命令未在后台运行。

有什么线索可以让日志重定向和后台运行正常工作吗?(bash -x 显示所构建的命令符合预期)

(实际上,与此示例不同,LOG和BACKGROUND的值是动态设置的)

3个回答

23
你可以使用eval命令实现它:
eval ${COMMAND}

6
注意,如果命令的参数需要引号,使用 eval 可能会出错。 - Aaron Digulla
1
我最终使用了这个答案 - 但是我标记了Aaron的答案为正确,因为它稍微更完整...希望我能将它们都标记为正确。 - Joel

19

eval会达到你想要的效果。

#!/bin/bash

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


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

注意:eval是邪恶的:http://mywiki.wooledge.org/BashFAQ/048 - ericek111

9

由于引号禁用了>&的特殊含义,所以它不能正常工作。您必须执行实现shell这些功能的命令。

要重定向,请在要记录的命令之前调用exec >> myfile.log 2>&1

要在后台运行程序,请使用nohupnohup cmd args...)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接