我动态地在bash中构造一个命令.这很好用:
COMMAND="java myclass"
${COMMAND}
Run Code Online (Sandbox Code Playgroud)
现在我想动态构造一个重定向输出的命令:
LOG=">> myfile.log 2>&1"
COMMAND="java myclass $LOG"
${COMMAND}
Run Code Online (Sandbox Code Playgroud)
该命令仍会调用java进程,但输出不会重定向到myfile.log
另外,如果我这样做:
BACKGROUND="&"
COMMAND="java myclass $BACKGROUND"
${COMMAND}
Run Code Online (Sandbox Code Playgroud)
该命令不在后台运行.
有关如何获取日志重定向和后台位的任何线索?(bash -x显示按预期构造的命令)
(实际上,与此示例不同,LOG和BACKGROUND的值是动态设置的)
tan*_*ens 15
您可以使用以下eval
命令执行此操作:
eval ${COMMAND}
Run Code Online (Sandbox Code Playgroud)
ezp*_*zpz 12
eval
做你想要的.
#!/bin/bash
CMD="echo foo"
OUT="> foo.log"
eval ${CMD} ${OUT}
CMD="sleep 5"
BG="&"
eval ${CMD} ${BG}
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为报价禁用的特殊意义>
和&
.您必须执行实现shell的这些功能的命令.
要重定向,请exec >> myfile.log 2>&1
在要记录的命令之前调用.
要在后台运行程序,请使用nohup
(nohup cmd args...
).