在下面的BASH代码中,变量ECHO_ALL是全局变量,并根据选项的输入解析设置为“是”或“否”。
---开始〜/ scripts / util / util-optout.sh ---
########################################
# @param $@
# @return the return value from $@
# @brief A wrapper function to allow
# for OPTional OUTput of any
# command w/wo args
#######################################
optout()
{
if [ ${ECHO_ALL} = 'no' ]; then
"$@" 1>/dev/null 2>&1
return $?
else
"$@"
return $?
fi
}
---文件结束---
在另一个bash文件中我获取上面的util-optout.sh文件并使用optout()函数来允许条件输出..本质上允许输出到/ dev / null的任何命令的条件重定向以使脚本保持静默。
例如在其他一些构建脚本中我有
source ~/scripts/util/util-optout.sh
optout pushd ${ZLIB_DIR}
optout rm -vf config.cache
optout CC=${BUILD_TOOL_CC} ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}
# ^^^^^^^^^^^^^^^^^^^
# ^ this breaks my optout() command
# my optout() fails when there are prefixed bash env vars set like CC=${...} before ./configure
optout popd
optout make -C ${ZLIB_DIR} ${ZLIB_COMPILER_OPT} all
optout make -C ${ZLIB_DIR} install
对于带有任何类型参数的简单命令,比如'pushd'或'rm'.. optout()效果很好。 即使是退出使-C的工作正常。
但是对于前缀为env-vars的命令,如optout CC = $ {...} ./configure ...
,它会给我一个错误utils / util-optout.sh:line 33:CC = gcc:command not found
有没有办法让我的optout()函数适用于任何可能的有效bash脚本行。
我知道它与我的optout()函数中使用“$ @”或“$ *”有关,但我已经详细研究了bash手册页,我无法让它适用于所有人可能的bash行案例。
到目前为止,使用我的optout()来克服此限制的唯一方法是以下3行样式;这很烦人。
export CC=${BUILD_TOOL_CC}
optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}
unset CC
有关如何将其全部减少到单个退出行的任何想法......行
答案 0 :(得分:3)
optout
是一个与其他命令一样的命令,因此必须先对环境进行任何本地修改。 optout
运行的命令将继承该环境。
CC=${BUILD_TOOL_CC} optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}
顺便说一下,这只是您optout
功能可能遇到的问题之一。你不能以这种方式运行任意命令行,只能使用一个简单的命令,后跟零个或多个参数(我希望即使是那个受限制的集也会有一些例外)。