它似乎eval
仅用于根据 和 的值有条件地向命令行添加一对QUIET_FLAG
参数OFFLINE_FLAG
。(根据代码,看起来它们的值是true
or false
,因此执行了同名命令)。更好的解决方案是将标志设置为任何值以启用它,并保持它未设置以禁用它。
"${JAVACMD}" \
${MAVEN_OPTS} \
-classpath "${CLASSWORLDS_JAR}" \
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
"-Dmaven.home=${M2_HOME}" \
"-Dos.arch=$(uname -m)" \
${CLASSWORLDS_LAUNCHER} ${QUIET_FLAG+:-q} ${OFFLINE_FLAG:+-o} \
${QUOTED_ARGS} ${MAVEN_ARGS}
如果QUIET_FLAG
设置为任何非空值,则其扩展将替换为-q
; 否则,空字符串将被替换,并且它会简单地从命令行中消失,因为它没有被引用。OFFLINE_FLAG
处理方式类似。这完全消除了对的需要eval
。
要保留当前true
/false
设置,请使用它们设置第二组变量:
# variable names are case-sensitive, so these are separate flags
QUIET_FLAG && quiet_flag=-q
OFFLINE_FLAG && offline_flag=-o
"${JAVACMD}" ... ${CLASSWORLDS_LAUNCHER} $quiet_flag $offline_flag ...
以上将在任何 POSIX shell 中工作。如果这是 for bash
,您可以通过将选项存储在数组中来简化命令调用本身。这消除了对行继续符的需要,因为数组中的值可以在多行上指定;在找到右括号之前,shell 知道数组不完整,而命令行由第一个未转义的换行符终止。
java_opts=( ${MAVEN_OPTS}
-classpath "${CLASSWORLDS_JAR}"
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf"
"-Dmaven.home=${M2_HOME}"
"-Dos.arch=$(uname -m)"
${CLASSWORLDS_LAUNCHER}
${QUIET_FLAG+:-q}
${OFFLINE_FLAG:+-o}
${QUOTED_ARGS}
${MAVEN_ARGS}
)
"${JAVACMD}" "${java_opts[@]}"