2013-07-18 75 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。

顺便说一下,您可以轻松完成此任务。