2013-01-31 19 views
2

所以我有一個單行bash命令來檢查一個目錄是否存在。如果確實如此,它會拉動,否則會克隆存儲庫。我在我的Windows中運行Cygwin的,當我在Cygwin中運行此命令時,它完美的作品:Windows + Cygwin +單行如果其他+ Puppet

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

我得到錯誤:

Error: ' 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' is not qualified and no path was specified. Please qualify the command or specify a path.

任何想法爲什麼?

+1

它可能是你的報價?嘗試將整個命令封裝爲「而不是」,並將可執行文件路徑包裹在「中」。 – dennmat

+0

我試過了,同樣的錯誤。 –

+0

發現這個,因爲我相信你有︰https://github.com/camptocamp/puppet-sudo/issues/10這個問題似乎來自不正確的文件路徑,如果你在同一臺機器上運行這應該不應該這不是一個問題。但是,當涉及到窗口風格的路徑時,木偶可能會做些時髦的事情? – dennmat

回答

1

Puppet是一個原生Windows程序(它沒有cygwin工作)。您在命令參數中編寫的內容基本上是一個簡短的sh(1)腳本。 Windows默認沒有sh(1),雖然它是由cygwin提供的。所以窗戶上的puppet不會嘗試通過sh(1)執行命令的內容。它應該是一個windows可執行文件的(絕對)名稱,帶有可選參數。如果你想調用一個cmd.exe內置,你需要做一些像command => 'cmd /c dir'

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