在bash中动态构建命令

时间:2009-11-11 14:40:12

标签: bash scripting

我正在动态地在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 个答案:

答案 0 :(得分:15)

您可以使用eval命令执行此操作:

eval ${COMMAND}

答案 1 :(得分:12)

eval做你想做的事。

#!/bin/bash

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


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

答案 2 :(得分:5)

它不起作用,因为引号会禁用>&的特殊含义。您必须执行实现shell的这些功能的命令。

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

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