2015-09-01 117 views
1

我有一個Xcode項目,其中包含可以複製一些文件的構建階段。假設我想將[project directory] ​​/ foo/bar中的所有rtf文件複製到[project directory] ​​/ bar/foo。我會用這樣的命令:在Xcode的運行腳本構建階段中使用bash

cp -v foo/bar/*.rtf bar/foo/ 

在終端中執行這也正是我期望:在富/酒吧所有的RTF文件複製到酒吧/ foo中。但是,建設的時候,我得到生成錯誤從CP:

Cp: foo/bar/*.rtf: No such file or directory 

cp似乎無法找到這些文件。就好像bash不擴展通配符。當腳本運行時,我知道我在正確的目錄中,因爲我在cp之前運行了pwd,它給出了我的預期。我已經將腳本階段的Shell設置爲/ bin/bash。我究竟做錯了什麼?我能否在Run Script構建階段使用globs?如果是這樣,爲什麼?

更新:found out,你可以關閉這樣的bash通配符:

set -o noglob 

,然後重新上是這樣的:

set +o noglob 

而且see all bash options and their status這樣的:

set -o 

我試過用t他後者在我的運行腳本階段,它顯示noglob已禁用。所以noglob不是這裏的問題。

+0

直接的問題是'foo/bar/*。rtf' *不匹配任何東西,所以它作爲一個文字字符串傳遞給'cp'。這是因爲當前工作目錄不是'[project directory]',或者因爲'foo/bar'中沒有RTF文件。 – chepner

+0

@chepner我已經證實我在項目目錄中,正如我所期望的(通過pwd),並且在foo/bar中有RTF文件。在Terminal中從項目目錄執行相同的命令就是我所期望的。 –

+0

@chepner我也試過使用完整路徑(〜/ Documents/Code/project/foo/bar/* .rtf)。同樣的結果。 –

回答

0

我對雙引號內的cp參數的路徑沒有意識到這一點,和通配不在引號中工作。問題解決了。

2

問題可以通過查看從生成日誌的構建腳本執行(按上構建腳本行右邊的圖標)得以展露,你會看到Xcode中運行該腳本:

/bin/sh -c \"cp -v foo/bar/*.rtf bar/foo/\" 

當用引號或雙引號括起來時,globbing不起作用。

我通常編寫一個腳本來做這種事情,然後運行它。因此,創建一個tools文件夾,旁邊的.xcodeproj,並在該腳本編寫複製指令(tools/copy_pdf_files.sh):

#!/bin/sh 
cp -v foo/bar/*.rtf bar/foo/ 

讓它從命令提示符下執行:

cd /path/to/project 
chmod +x tools/copy_pdf_files.sh 

然後運行,而不是:

${PROJECT_DIR}/tools/copy_pdf_files.sh 
+0

該模式不在引號中。如這裏所示,你只需要shell運行一個名爲'「cp'的命令,如果引號*沒有被轉義,那就沒問題了,因爲整個字符串被傳遞給'sh'並被解析。 – chepner

+0

@ chepner是的,你可能是對的,看來OP已經解決了這個問題,但是他的回答暗示了他發佈的內容和配置的內容是不同的,所以誰知道。 – trojanfoe

相關問題