我正在动态地在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的值是动态设置的)
答案 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
。
要在后台运行程序,请使用nohup
(nohup cmd args...
)。