/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 아님)를 사용합니다.

도와주세요! 이러한 이유로 현재 두 개의 별도 dockerfile이 필요합니다.

작은 따옴표, 이스케이프 따옴표, "$ARG" 및 $ARG를 사용해 보았습니다. 아무것도 작동하지 않습니다. cmake는 -mVectorize-with-neon-quad를 매개변수로 처리하거나 -DWITH_CPU 매개변수를 전체 문자열로 처리합니다.

답변1

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

cmake은 내용을 하나의 인수로 사용하여 호출되는 반면 , 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배열 변수를 지원하지 않습니다. 해당 변수에는 하나의 값만 포함될 수 있습니다.

그러나 단어로 표시되지 않을 것으로 알고 있는 한 문자로 구분된 값을 저장하고 분할+글로브 연산자를 사용하여(변수를 따옴표로 묶지 않음) 다시 분할하고 싶지 않은 글롭 부분을 비활성화할 수 있습니다.

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

관련 정보