Windows + Cygwin + Single Line If Else + Puppet

Así que tengo un solo command bash de línea que comtesting si existe un directory. Si lo hace, git pulls, si no lo hace, clona el repository. Estoy ejecutando un Cygwin en mi cuadro de Windows y cuando ejecuto este command en Cygwin funciona perfectamente:

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 

Cuando ejecuto el mismo command desde Puppet, así:

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

Me sale un error:

Error: 'si [-d C: / repo]; luego cd C: / repo && "C: / Program Files (x86) /Git/bin/git.exe" pull; else "C: / Archivos de progtwig (x86) /Git/bin/git.exe" clonar -b desarrollar https: //repo.git C: / repo; fi 'no está calificado y no se especificó ninguna ruta. Califique el command o especifique una ruta.

¿Alguna idea de por qué?

Puppet es un progtwig nativo de Windows (funciona sin cygwin). Lo que has escrito en el command -parámetro es básicamente un script corto sh (1). Windows no tiene sh (1) por defecto, aunque lo proporciona cygwin. Entonces, Puppet on Windows no intentará ejecutar el contenido del command a través de sh (1). Debe ser el nombre (absoluto) de un ejecutable de Windows, con parameters opcionales. Si desea invocar un command incorporado cmd.exe, debe hacer algo como command => 'cmd /c dir' .

escapa de tus citas o usa comillas simples y usa cygdrive, por lo que tu código debería verse así:

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

y esto:

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

Y si incluso instalas git dentro de cygwin, puedes hacerlo más simple:

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