我想使用一个循环来查找一些文件并重命名它们:
for i in `find $@ -name *_cu.*`;do mv $i "$(echo $i|sed s/_cu//)"
done这在shell中有效。但是我如何在makefile配方中做到这一点呢?
发布于 2012-01-06 20:28:58
在将非平凡的shell片段放到make食谱中时,您需要了解两件主要的事情:
配方中的
所以您的shell片段必须全部写在一行(可能有反斜杠)上。此外,它实际上是作为单行显示给shell的(反斜杠-换行符不是普通的换行符,因此shell不会将其用作命令终止符),因此必须在语法上正确。
$@,$i)引入的,因此您需要通过将它们编写为$$i来隐藏您的shell变量。(更准确地说,您希望被shell看到的任何美元符号都必须通过将其编写为$$.)来从make中转义
通常,在shell脚本中,您将在单独的行上编写单独的命令,但在这里,您实际上只有一行,因此必须用分号分隔各个shell命令。将所有这些放到您的示例中会产生:
foo: bar
for i in `find $@ -name *_cu.*`; do mv $$i "$$(echo $$i|sed s/_cu//)"; done或者等效地:
foo: bar
for i in `find $@ -name *_cu.*`; do \
mv $$i "$$(echo $$i|sed s/_cu//)"; \
done请注意,后者即使布局在几行上也同样需要小心使用分号才能使shell满意。
发布于 2016-12-27 05:49:04
我发现这很有用,尝试使用for循环来构建多个文件:
PROGRAMS = foo bar other
.PHONY all
all: $(PROGRAMS)
$(PROGRAMS):
gcc -o $@ $@.c它会将foo.c,bar.c,other.c编译成foor bar其他可执行文件
发布于 2021-10-07 20:12:11
我花了很多时间在这上面,最后让它工作了。我有一个简单的解决方案,使用makefile中的全局变量对所有目标可用,但我不想这样做,所以我就是这样做的。
target:
$(eval test_cont=$(shell sh -c "docker ps | grep test" | awk '{print $$1}'))
for container in $(test_cont);do \
docker cp ssh/id_rsa.pub $${container}:/root/.ssh/authorized_keys; \
docker exec -it $${container} chown root.root /root/.ssh/authorized_keys; \
donehttps://stackoverflow.com/questions/8756522
复制相似问题