[英]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.