将完整的bash脚本行传递给另一个bash函数来执行

时间:2013-07-25 19:27:39

标签: linux bash function arguments

在下面的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

有关如何将其全部减少到单个退出行的任何想法......行

1 个答案:

答案 0 :(得分:3)

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

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

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