Windows + Cygwin + однострочный, если еще + кукольный

Итак, у меня есть однострочная команда bash, которая проверяет, существует ли каталог. Если да, то git тянет, если нет, то клонирует репозиторий. Я запускаю Cygwin на своем компьютере с Windows, и когда я запускаю эту команду в 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' не является квалифицированным, и путь не указан. Уточните команду или укажите путь.

Есть идеи, почему?


person Richard Knop    schedule 31.01.2013    source источник
comment
Может это ваши цитаты? Попробуйте обернуть всю команду в ' вместо того, чтобы оставить пути к исполняемому файлу в '.   -  person dennmat    schedule 31.01.2013
comment
Пробовал, та же ошибка.   -  person Richard Knop    schedule 31.01.2013
comment
Нашел это, как я уверен, у вас есть: github.com/camptocamp/puppet-sudo/ Issues/10 проблема, похоже, возникает из-за неправильных путей к файлам, если вы запускаете это на том же компьютере, проблем быть не должно. Однако, возможно, puppet делает какие-то странные вещи, когда дело доходит до путей в стиле окна?   -  person dennmat    schedule 01.02.2013
comment
Вы пытались переместить git.exe в папку, где путь не содержит пробелов?   -  person tewe    schedule 01.02.2013
comment
У меня нет конкретной причины полагать, что это что-то изменит, но я не могу не зацикливаться на путях в стиле Windows и удивляться, когда вижу их. Не могли бы вы попробовать изменить их на /cygdrive/c/... в стиле Unix, просто чтобы посмотреть, есть ли разница? Вы можете использовать команду cygpath для преобразования путей, если не хотите делать это вручную.   -  person Costa    schedule 01.02.2013
comment
Просто мысль - должна ли эта команда работать под Bash на Puppet?   -  person Mark Leighton Fisher    schedule 09.02.2013
comment
Попробуйте command => "bash -c 'if [ -d .... '".   -  person Perleone    schedule 09.02.2013


Ответы (2)


Puppet — это родная программа для Windows (работает без cygwin). То, что вы написали в команде -parameter, по сути является коротким скриптом sh(1). В Windows по умолчанию нет sh(1), хотя он предоставляется cygwin. Таким образом, puppet в Windows не будет пытаться выполнить содержимое команды через sh(1). Это должно быть (абсолютное) имя исполняемого файла Windows с необязательными параметрами. Если вы хотите вызвать встроенный cmd.exe, вам нужно сделать что-то вроде command => 'cmd /c dir'.

person ptman    schedule 20.04.2013

избегайте кавычек или используйте одинарные кавычки и используйте 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"
}

И если вы даже установите git внутри cygwin, вы можете сделать это проще:

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"
}
person Chris Godwin    schedule 05.06.2017