2013-07-18 117 views
0

在Mac使用bash shell的OSX問題與OSX命令行通配符

我一直在試圖寫一個簡短的shell腳本來照顧我的編譯過程的一部分,但是當我試圖運行腳本在每個文件中,通配符似乎不像我期望的那樣行事。

的腳本如下:

rm *.cs 
rm *.bin 
protoc -I. *.proto -o*.bin 
mono protogen -i:*.bin -o:*.cs 

現在,當我的手型,在此對每個文件的命令行,它工作正常。然而,當使用通配符運行這個shell腳本時,它會創建「* .bin」和「* .cs」,而不是針對每個不同輸入的單獨的.bin和.cs文件。我濫用通配符,還是會變得奇怪?

+0

提示:shell逐行解析,什麼是你在第三行? :) – Jite

+0

請將您的腳本完整發布,您可能會得到更好的答案。 – Dan

回答

1

嘗試像(未測試):

protofiles="*.proto" 
rm *.cs 
rm *.bin 
for i in $protofiles; do 
binfile=${i/.proto/.bin} 
protc -I. $i -o$binfile 
done 
binfiles="*.bin" 
for i in $binfiles; do 
csfile="${i/.bin/.cs} 
mono prtogen -i:$i -o:$csfile 
done 

反正......我建議你使用的Makefile這項工作。嘗試這樣的東西(未測試):

CSFILES=a.cs b.cs d.cs e.cs 

clean: 
     rm *.cs *.bin 

%.bin: %.proto 
     protoc -I. $< -o [email protected] 

%.cs: %.bin 
     mono prtogen -i:$< -o:[email protected] 

all: $(CSFILES) 
+1

通過對解決方案的快速說明或您看到並解決的問題,您的答案會更好。 – Jite

2

通配符不能像那樣工作。他們只是由現有的匹配文件名列表取代。所以如果你是rm * .bin,那麼* .bin在下一個語句中什麼都不匹配。它們不會在同一命令行中奇蹟般地「捕獲」來自另一個令牌的替換值。

在bash中,結果是* .bin保持不變,所以它應該創建文件* .bin,而不是.bin。但是你可能正在使用不同的shell。

順便說一下,您可以輕鬆完成此任務。