在下面的 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() 效果很好。甚至 optout make -C 也可以正常工作。
但是对于具有前缀 env-vars 设置的命令(例如 optout CC=${...} ./configure ...
utils/util-optout.sh:第 33 行:CC=gcc:找不到命令
有没有办法让我的 optout() 函数适用于任何可能的有效 bash 脚本行。
我知道这与在我的 optout() 函数中使用“$@”或“$*”有关,但我已经详细研究了 bash 手册页,但我无法使其适用于所有可能的 bash 行案例。
到目前为止,使用我的 optout() 克服此限制的唯一方法是以下 3 行样式;这很烦人。
export CC=${BUILD_TOOL_CC}
optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}
unset CC
关于如何将其全部减少到单个 optout ... 行的任何想法