1

以下の 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 つのオプトアウト ... 行に戻す方法についてのアイデア

4

1 に答える 1

3

optoutは他のコマンドと同様にコマンドであるため、環境へのローカル変更が先行する必要があります。実行するコマンドはoptoutその環境を継承します。

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

ところで、これはoptout関数で遭遇する可能性が高い問題の 1 つにすぎません。そのような方法で任意のコマンド ラインを実行することはできません。単純なコマンドの後に 0 個以上の引数が続くだけです (その制限されたセットにもいくつかの例外があると思います)。

于 2013-07-25T20:08:21.767 に答える