簡體   English   中英

將完整的bash腳本行傳遞給另一個bash函數來執行

[英]Pass a full bash script line to another bash function to execute

在下面的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:找不到命令

有沒有辦法讓我的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是一個與其他命令一樣的命令,因此必須先對環境進行任何本地修改。 optout運行的命令將繼承該環境。

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

順便說一句,這只是您的optout功能可能遇到的問題之一。 你不能以這種方式運行任意命令行,只能使用一個簡單的命令后跟零個或多個參數(我希望即使是那個受限制的集合也有一些例外)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM