我试图将所有带脚本的.txt转换为其他格式
我允许仅为目标使用shell命令,但我不允许使用循环...
顺便说一下,我必须使用仪表解释器
该脚本称为txtConverter。它从stdin读取txt并将转换后的文本(可能是markdown或其他格式)放到stdout中。因此,我必须读取当前目录中的所有.txt文件,并通过将脚本用于具有不同文件名的显式格式来转换每个文件。
例如,如果当前目录中只有1个.txt文件,则在使用makefile后应该有2个文件:
1. Directory: Hallo.txt
2. using make
3. Directory: Hallo.txt
Hallo.sh
我发现了这样的事情:
OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt))
这应该查找.txt文件并将其转换为.sh文件吗?
convertToSh : $(OBJ)
What kind of Code?
但是我需要一个规则才能正确转换?
%.txt : %.sh
问题是我不知道如何使用shell代码来填充.sh文件,如:
cat $< | ./txtConverter > $@
如果我使用$()来执行shell代码,那么它也会起作用:
@echo $(ls -1)
我是Makefiles的新手,我正在看一部纪录片,但我真的不明白它是如何运作的。 如果你把所有这些放在一个Makefile中,我不确定它是怎么样的。 求救!
解决方案:
向@MadScientist发送Thx,向A Makefile to Convert All Markdown Files to PDFs Using Pandoc
发送.RECIPEPREFIX = ~
OBJS=$(patsubst %.txt, %.sh, $(wildcard *.txt))
convertToSh : $(OBJS)
%.sh : %.txt
~ ./convertTxtToSh > $@ < $<
工作正常!在@MadScientist的GNU手册中找到.RECIPEPREFIX = ~
答案 0 :(得分:1)
了解make(IMO)的最佳地点是GNU Make Manual。当然,make有不同的版本,本手册讨论了GNU版本,但这可能是最常见的版本。
规则的配方是用shell脚本语法编写的,所以你可以将shell代码直接放在那里作为配方。
但是,模式规则定义是 target :先决条件。因此,在您想要从.sh
(先决条件)创建.txt
(目标)的情况下,您需要写:
%.sh : %.txt
cat $< | ./txtConverter > $@
或者为了避免UUOC你可以写:
%.sh : %.txt
./txtConverter > $@ < $<
请记住,您必须在配方行之前使用实际的TAB字符。确保您的编辑器不会用空格或其他东西替换它。
然而,这只是一个告诉make的模板,&#34;如果你想创建foo.sh,并且你有(或者可以弄清楚如何构建)foo.txt,那么你可以使用这个配方来做到这一点&#34;。
接下来,您需要告诉make要创建哪些.sh
个文件。你已经弄清楚了:
OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt))
然后你需要告诉make来构建这些。你可以用:
convertToSh : $(OBJ)
但是这个规则并不需要一个配方:这里没有任何事可做,因为所有的工作都是在模式规则中完成的。这只是将所有先决条件收集到一个地方的简单方法。