【问题标题】:Execute commands with spaces in shell script在shell脚本中执行带空格的命令
【发布时间】:2016-03-18 02:40:00
【问题描述】:

我有这个脚本:

build.sh

#!/bin/bash
MSBUILD="/c/Program\ Files \(x86\)/MSBuild/14.0/Bin/msbuild.exe my.sln //p:Configuration=Debug //t:Rebuild"
$MSBUILD

错误

/c/Program: 没有这样的文件或目录

我已经尝试了上述多种组合。 Bash 不会识别路径中的那个空间。我该如何执行?

【问题讨论】:

  • @Shomz - 你为什么这么认为?

标签: windows msbuild git-bash


【解决方案1】:

这是我最终使用的:

MSBUILD[0]="/c/Program Files (x86)/MSBuild/14.0/Bin/msbuild.exe"
MSBUILD[1]=./mySolutionName.sln
MSBUILD[2]=/property:Configuration=Debug
MSBUILD[3]=/target:Clean,Build

"${MSBUILD[0]}" "${MSBUILD[1]}" "${MSBUILD[2]}" "${MSBUILD[3]}"

我偶然发现a similar issuevariable expansion 打交道。另请注意,速记对我不起作用:

"/p:Configuration=Debug" 变为 "/property:Configuration=Debug"

【讨论】:

    【解决方案2】:

    对 bash 有更深入了解的人应该能够解释这背后的确切机制,因为我不能,但我知道如何应用 a solution:仅在扩展变量时使用引号(否则引号也会被解释显然)并使用数组,否则你不能不使用引号。还要注意/ 应该是单个的。

    MSBUILD[0]=/c/Program\ Files \(x86\)/MSBuild/14.0/Bin/msbuild.exe
    MSBUILD[1]=my.sln
    MSBUILD[2]=/p:Configuration=Debug
    
    "$MSBUILD[@]"
    

    【讨论】:

    • 由于变量扩展的问题,我不相信这会起作用。不过数组是个好主意。
    • cygwin bash 实际上,它在那里工作;我这里只有 sourcetree,如果我从它打开一个终端,它会给我一个带有 sh 而不是 bash 的终端,所以我没有用它来测试
    【解决方案3】:

    当您使用包含空格的路径/命令时,您需要先引用路径,这对您有用:

    test.proj

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <Target Name="Build">
        <Message Text="Hello World! $(ABC)" Importance="high"/>
      </Target>
    
    </Project>
    

    build.sh

    #!/bin/bash
    MSBUILDPATH=c:/Program\ Files\ \(x86\)/MSBuild/14.0/Bin/msbuild.exe
    "$MSBUILDPATH" test.proj //t:build //p:ABC=123
    

    或(插入反斜杠)

    #!/bin/bash
    MSBUILD=c\:\\Program\ Files\ \(x86\)\\MSBuild\\14.0\\Bin\\msbuild.exe
    "$MSBUILD" test.proj //t:build //p:ABC=123
    

    我毫无问题地传递了目标 (/t:) 和属性 (/p:),只需对它们使用双斜杠即可。还要注意驱动器号后面的冒号 (:)。

    如果您需要传递包含空格的属性,请执行以下操作:

    "$MSBUILD" test.proj //t:build //p:ABC="123 456 789"
    

    您可以先定义路径,然后在引号中使用它们来执行命令。

    你可以复制粘贴这个例子,它会为你工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多