Macos OSX命令行通配符的问题
在macosx中使用bashshell 我一直在尝试编写一个简短的shell脚本来处理编译过程的一部分,但是当我尝试在每个文件上运行脚本时,通配符的行为似乎不像我所期望的那样 脚本如下:Macos OSX命令行通配符的问题,macos,bash,shell,Macos,Bash,Shell,在macosx中使用bashshell 我一直在尝试编写一个简短的shell脚本来处理编译过程的一部分,但是当我尝试在每个文件上运行脚本时,通配符的行为似乎不像我所期望的那样 脚本如下: rm *.cs rm *.bin protoc -I. *.proto -o*.bin mono protogen -i:*.bin -o:*.cs 现在,当我在命令行中为每个文件手动键入这个时,它工作得很好。但是,当使用通配符运行这个shell脚本时,它会为每个不同的输入创建“*.bin”和“*.cs”,而
rm *.cs
rm *.bin
protoc -I. *.proto -o*.bin
mono protogen -i:*.bin -o:*.cs
现在,当我在命令行中为每个文件手动键入这个时,它工作得很好。但是,当使用通配符运行这个shell脚本时,它会为每个不同的输入创建“*.bin”和“*.cs”,而不是单独的.bin和.cs文件。我是误用了通配符,还是有什么奇怪的事情发生了?通配符不是这样工作的。它们只是被现有匹配文件名的列表替换。因此,如果您使用rm*.bin,那么*.bin与下一条语句中的任何内容都不匹配。它们不会在同一命令行中从另一个令牌神奇地“捕获”替换的值 在bash中,结果是*.bin保持不变,因此它应该创建文件*.bin,而不是.bin。但您可能正在使用不同的shell
顺便说一下,使用make可以轻松完成此任务。通配符不是这样工作的。它们只是被现有匹配文件名的列表替换。因此,如果您使用rm*.bin,那么*.bin与下一条语句中的任何内容都不匹配。它们不会在同一命令行中从另一个令牌神奇地“捕获”替换的值 在bash中,结果是*.bin保持不变,因此它应该创建文件*.bin,而不是.bin。但您可能正在使用不同的shell 顺便说一句,使用make可以轻松完成此任务。尝试类似(未测试)的方法: 无论如何。。。我建议你使用makefile来完成这项工作。尝试以下方法(未经测试):
CSFILES=a.cs b.cs d.cs e.cs
清洁:
rm*.cs*.bin
%.bin:%.proto
protoc-I.$<-o$@
%.cs:%.bin
mono prtogen-i:$<-o:$@
全部:$(CSF文件)
尝试以下方法(未测试):
无论如何。。。我建议你使用makefile来完成这项工作。尝试以下方法(未经测试):
CSFILES=a.cs b.cs d.cs e.cs
清洁:
rm*.cs*.bin
%.bin:%.proto
protoc-I.$<-o$@
%.cs:%.bin
mono prtogen-i:$<-o:$@
全部:$(CSF文件)
对您的解决方案或您看到并解决的问题进行快速解释,您的答案会更好。对您的解决方案或您看到并解决的问题进行快速解释,您的答案会更好。请完整发布您的脚本,您可能会得到更好的答案。提示:shell逐行解析,第三行还有什么留给你的?:)请完整地发布您的脚本,您可能会得到更好的答案。提示:shell逐行解析,第三行还有什么留给您的?:)
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
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)