在下面的bash代码中,变量echo_all是全局变量,并根据选项的输入解析设置为“yes”或“no”。
---开始~/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:行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是一个与其他命令类似的命令,因此必须先对环境进行任何本地修改。optout运行的命令将继承该环境。

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

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

关于linux - 将完整的bash脚本行传递给另一个bash函数以执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17867051/

10-13 05:10