1

在下面的 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 ... 行的任何想法

4

1 回答 1

3

optout是一个和其他命令一样的命令,因此必须在对环境进行任何本地修改之前。运行的命令optout将继承该环境。

CC=${BUILD_TOOL_CC} optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}

顺便说一句,这只是您在使用optout函数时可能遇到的问题之一。您不能以这种方式运行任意命令行,只能运行一个简单的命令,后跟零个或多个参数(我希望即使是那个受限集也会有一些例外)。

于 2013-07-25T20:08:21.767 回答