以下の 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 のものは正常に動作します。
しかし、optout CC=${...} ./configure ... のようにプレフィックス env-vars が設定されているコマンドではエラーが発生します。
utils/util-optout.sh: 33 行目: CC=gcc: コマンドが見つかりません
私の optout() 関数を有効な bash スクリプト行で動作させる方法はありますか?
optout() 関数での「$@」または「$*」の使用と関係があることはわかっていますが、bash の man ページを詳細に調べたところ、考えられるすべての bash 行で機能させることはできません。ケース。
これまでのところ、私の optout() でこの制限を乗り越える唯一の方法は、次の 3 行のスタイルです。これは迷惑です。
export CC=${BUILD_TOOL_CC}
optout ./configure ${ZLIB_CONFIGURE_OPT} --prefix=${CURR_DIR}/${INSTALL_DIR}
unset CC
すべてを 1 つのオプトアウト ... 行に戻す方法についてのアイデア