2

所以我有一个单行 bash 命令来检查目录是否存在。如果是,它会 git pull,如果不是,它会克隆存储库。我在我的 Windows 机器上运行 Cygwin,当我在 Cygwin 中运行此命令时,它运行良好:

if [ -d C:/repo ]; then cd C:/repo && "C:/Program Files (x86)/Git/bin/git.exe" pull; else "C:/Program Files (x86)/Git/bin/git.exe" clone -b develop https://repo.git C:/repo; fi

当我像这样从 Puppet 运行相同的命令时:

exec {'checkout repository':
    command => "if [ -d C:/repo ]; then cd C:/repo && "C:/Program Files (x86)/Git/bin/git.exe" pull; else "C:/Program Files (x86)/Git/bin/git.exe" clone -b develop https://repo.git C:/repo; fi"
}

我得到错误:

错误:'如果 [ -d C:/repo ]; 然后 cd C:/repo && "C:/Program Files (x86)/Git/bin/git.exe" pull; else "C:/Program Files (x86)/Git/bin/git.exe" clone -b develop https://repo.git C:/repo; fi' 不合格且未指定路径。请限定命令或指定路径。

任何想法为什么?

4

2 回答 2

1

Puppet 是一个原生的 Windows 程序(它可以在没有 cygwin 的情况下工作)。您在 command -parameter 中编写的内容基本上是一个简短的 sh(1) 脚本。Windows 默认没有 sh(1),尽管它是由 cygwin 提供的。所以 windows 上的 puppet 不会尝试通过 sh(1) 执行命令的内容。它应该是 Windows 可执行文件的(绝对)名称,带有可选参数。如果您希望调用 cmd.exe 内置,您需要执行类似command => 'cmd /c dir'.

于 2013-04-20T15:12:59.760 回答
0

转义引号或使用单引号并使用 cygdrive,因此您的代码应如下所示:

exec {'checkout repository':
    command => "if [ -d C:/repo ]; then cd C:/repo && 'C:/Program Files (x86)/Git/bin/git.exe' pull; else 'C:/Program Files (x86)/Git/bin/git.exe' clone -b develop https://repo.git C:/repo; fi"
}

和这个:

exec {'checkout repository':
    command => "if [ -d /cygdrive/c/repo ]; then cd /cygdrive/c/repo && '/cygdrive/c/Program Files (x86)/Git/bin/git.exe' pull; else '/cygdrive/c/Program Files (x86)/Git/bin/git.exe' clone -b develop https://repo.git /cygdrive/c/repo; fi"
}

如果你甚至在 cygwin 中安装 git,你可以让它变得更简单:

exec {'checkout repository':
    command => "if [ -d /cygdrive/c/repo ]; then cd /cygdrive/c/repo && git pull; else git clone -b develop https://repo.git /cygdrive/c/repo; fi"
}
于 2017-06-05T06:40:21.053 回答