在bash中动态构建命令

Joe*_*oel 14 bash scripting

我动态地在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)

  • 请注意,如果命令的参数需要引用,则"eval"可能会中断. (5认同)

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)


Aar*_*lla 6

这是行不通的,因为报价禁用的特殊意义>&.您必须执行实现shell的这些功能的命令.

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

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