Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX命令行通配符的问题_Macos_Bash_Shell - Fatal编程技术网

Macos OSX命令行通配符的问题

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”,而

在macosx中使用bashshell

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

脚本如下:

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)