linux - 在 bash 中转义空格

标签 linux bash escaping cmake

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

我正在编写一个 bash 函数来配置 cmake 构建。我将 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++"...,看起来还不错。如果我将其复制粘贴到我的 shell 中,它就可以正常工作。但是如果我使用

cmake $CMAKEARGS

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

提前致谢

最佳答案

你不能安全地在这样的字符串中嵌入空格;在扩展 CMAKEARGS 之后,没有办法知道哪些空格是数据,哪些只是分隔单词(或者更确切地说,bash 假设所有空格都是分词器;嵌入的引号是按字面意思处理,而不是引用运算符)。这就是发明 shell 数组的原因。

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]}" ...

关于linux - 在 bash 中转义空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21761859/

相关文章:

bash - 在 Bash 中使用 sed 转义域名中的点

json - 取消转义 JSON 响应字符串中的字符

coldfusion - CFQUERY 没有正确转义单引号

android - 当总线速度为 480 Mbps 时,wlan 通过 USB 的环回吞吐量仅为 273 Mbps

java - 行结束问题 DOS > Linux > Java

java - Logstash 加载错误

c - linux 查找调用的命令

string - 在bash中检查文件是否包含多行字符串

当调用 subshel​​l 时,Bash while 循环在第一次迭代后停止

bash - 在bash中读取多个文件