/bin/sh 文字列変数を複数の引数として使用する

/bin/sh 文字列変数を複数の引数として使用する

ARGが設定されたドッカーコンテナがあります。

CMAKE_ARGS=-DWITH_CPU=arm -DCMAKE_C_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad" -DCMAKE_CXX_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad"

それから私はcmakeにコマンドライン引数として渡したいと思います。

cmake ../. -DCMAKE_INSTALL_LIBDIR=/usr/lib "$CMAKE_ARGS"

しかし失敗しました。 「または空白のためだと思います。

Docker ARGは文字列のみを使用し、dockerは/ bin / sh(bashではない)を使用します。

助けてください!このため、現在2つの別々のdockerfileが必要です。

一重引用符、エスケープ引用符、「$ ARG」、および$ ARGを試しました。何も動作しません。 cmakeは-mVectorize-with-neon-quadをパラメータとして扱うか、-DWITH_CPUパラメータを文字列全体として扱います。

ベストアンサー1

cmake ../. -DCMAKE_INSTALL_LIBDIR=/usr/lib "$CMAKE_ARGS"

cmakeは、内容を1つの引数として使用して呼び出されるのに対し、3つの別々の引数に渡す$CMAKE_ARGS必要があるようです。-DWITH_CPU=arm-DCMAKE_C_FLAGS=-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad-DCMAKE_CXX_FLAGS=-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quadcmake

POSIX はsh配列変数をサポートしません。その変数には1つの値しか含めることができません。

ただし、単語として表示されないことがわかっている限り、文字で区切られた値を保存し、分割+グローブ演算子を使用して(変数を引用符で囲んでいない)、再分割したくないグローブ部分を無効にすることができます。

CMAKE_ARGS='-DWITH_CPU=arm|-DCMAKE_C_FLAGS=-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad|-DCMAKE_CXX_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad'
IFS='|' # split on |
set -o noglob # disable globbing
cmake ../. -DCMAKE_INSTALL_LIBDIR=/usr/lib $CMAKE_ARGS # split+glob

おすすめ記事