繁体   English   中英

在bash中转义空间

[英]Escaping a space in bash

显然,这不是一个简单的问题,因为到目前为止,我还没有通过谷歌搜索或搜索SO找到解决方案。 无论如何,如果这是重复的,很抱歉将其发布。

我正在编写用于配置cmake构建的bash函数。 我将我的cmake参数保存在这样的变量中:

CMAKEARGS=".. "`
         `"-DCMAKE_BUILD_TYPE=${build_type} "`
         `"-DBoost_INCLUDE_DIR=${boost_dir} "`
         `"-DGCL=ON "`
         `"-DENABLE_PERFORMANCE_METERS=OFF "`
         `"-DENABLE_CACHING=ON "`
         `"-DENABLE_CUDA_STREAMS=ON "`
         `"-DENABLE_LOGGING=OFF "

在某些时候,我必须添加以下参数: -DCUDA_NVCC_FLAGS="-I${mpi_path}/include -ccbin=$(which g++)"

如您所见,如果有引号"我显然必须转义(这不是问题),并且两个“子参数”之间存在空格,这会造成很多麻烦。我尝试了以下操作:

CMAKEARGS+="'-DCUDA_NVCC_FLAGS=\"-I${mpi_path}/include -ccbin=$(which g++)\"' "

最后,CMAKEARGS的内容为: ... -DCUDA_NVCC_FLAGS="-I/opt/cray/mpt/6.2.1/gni/mpich2-cray/81/include -ccbin=/opt/gcc/4.8.2/bin/g++" ... ,看起来确实不错。 如果我将其复制粘贴到外壳中,则可以正常工作。 但是如果我用

cmake $CMAKEARGS

从我的函数中,它认为-ccbin = / opt / gcc / 4.8.2 / bin / g ++”(不是只有一个引号" )是源目录,并且失败。 我怎样才能逃脱这个空间? 我尝试在其前面放一个\\ ,用单引号,双引号将整个参数括起来,...

提前致谢

您不能安全地在这样的字符串中嵌入空格; CMAKEARGS ,无法知道哪个空格是数据,哪些空格简单地分隔单词(或者bash假定所有空格都是单词分隔符;嵌入式引号被按字面处理,而不是引用运算符)。 这就是发明壳数组的原因。

declare -a CMAKEARGS   # optional, the assignment that follows is sufficient
CMAKEARGS=(..
           "-DCMAKE_BUILD_TYPE=${build_type}"
           "-DBoost_INCLUDE_DIR=${boost_dir}"
           "-DGCL=ON"
           "-DENABLE_PERFORMANCE_METERS=OFF"
           "-DENABLE_CACHING=ON"
           "-DENABLE_CUDA_STREAMS=ON"
           "-DENABLE_LOGGING=OFF"
)

要使用它:

cmake "${CMAKEARGS[@]}" ...

数组将扩展为带引号的单词序列,每个元素一个。 这样,数组元素中的所有空格都会保留,而不会按字面意义使用。 相当于

cmake "${CMAKEARGS[0]}" "${CMAKEARGS[1]}" ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM