0

在 Mac OSX 中使用 bash shell

我一直在尝试编写一个简短的 shell 脚本来处理我的编译过程的一部分,但是当我尝试在每个文件上运行脚本时,通配符的行为似乎不像我期望的那样。

脚本如下:

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

现在,当我在每个文件的命令行中手动键入它时,它工作正常。但是,当使用通配符运行此 shell 脚本时,它最终会为我的每个不同输入创建“*.bin”和“*.cs”,而不是单独的 .bin 和 .cs 文件。我是在滥用通配符,还是有些奇怪?

4

2 回答 2

2

通配符不是那样工作的。它们只是被现有匹配文件名列表替换。因此,如果您 rm *.bin,则 *.bin 在下一条语句中不匹配任何内容。它们不会神奇地从同一命令行中的另一个标记“捕获”替换值。

在 bash 中,结果将是 *.bin 保持不变,因此它应该创建文件 *.bin,而不是 .bin。但是您可能正在使用不同的外壳。

顺便说一句,您可以使用 make 轻松完成此任务。

于 2013-07-18T15:40:50.777 回答
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

无论如何...我建议您使用 Makefiles 来完成这项工作。尝试这样的事情(未经测试):

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

clean:
        rm *.cs *.bin

%.bin: %.proto
        protoc -I. $< -o $@

%.cs: %.bin
        mono prtogen -i:$< -o:$@

all: $(CSFILES)
于 2013-07-18T15:41:21.203 回答