2017-07-03 72 views
0

我试图将所有.txt与脚本转换为不同的格式。
我被允许使用shell命令仅仅用于目标,但我不允许使用循环...
顺便说一句我必须使用破折号解释器。
该脚本被称为txtConverter。它从stdin中读取txt,并将转换后的文本(可能是markdown或其他格式)放到stdout中。所以我必须读取当前目录中的所有.txt文件,并通过使用脚本将每个文件转换为具有不同文件名的显式格式。
例如,如果有在当前目录中仅有1个.txt文件,应该有2个文件使用Makefile后:Makefile将当前目录中的文件转换为

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 > [email protected] 

如果我使用$()执行shell代码它好好尝试工作,以及像:

@echo $(ls -1) 

我是新来的Makefiles和我在看纪录片,但我真的不明白它是如何工作的。 我不确定它是如何将所有这些放在一个Makefile中。 Thx求助!

发现的解决方案:

THX到@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 > [email protected] < $< 

工作正常!在@MadScientist的GNU手册中发现.RECIPEPREFIX = ~

+0

注意GNU make 4.0中增加了'.RECIPEPREFIX',所以一些发行版可能会有不支持它的旧版本的GNU make。如果您对答案满意,不要忘记将其标记为已接受(单击对号),以便人们看到问题已得到解答。 – MadScientist

回答

1

要了解有关make(IMO)的最佳位置是GNU Make Manual。当然,制作有不同的版本,本手册讨论GNU版本,但这可能是最常用的版本。

规则的配方是用shell脚本语法编写的,所以你可以直接把shell代码作为配方。

然而,图案规则定义是目标前提。所以你的情况,你想从一个.txt(在前提)你想写创建.sh(该目标):

%.sh : %.txt 
     cat $< | ./txtConverter > [email protected] 

或者避免你可以写的UUOC:

%.sh : %.txt 
     ./txtConverter > [email protected] < $< 

请记住,您必须在配方行之前使用实际的制表符。确保你的编辑器不会用空格或其他东西代替它。

但是,这只是一个告诉make的模板,“如果你想创建foo.sh,并且你有(或者可以想出如何构建)foo.txt,那么你可以使用这个配方来做到这一点”。

所以接下来你需要告诉make你想创建哪个.sh文件。你已经知道如下:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 

然后,你需要告诉make来建立这些。你可以做到这一点:

convertToSh : $(OBJ) 

但这一规则并不需要一个偏方:没有什么,因为所有的工作都在模式规则做,在这里做。这只是将所有先决条件集中到一个地方的一种简单方法。

+0

Thx很多。如果我想从bash调用它,如何使用配方? convertToSh很容易在bash中用“make convertToSh”调用。但是,如果我这样做,bash会抛出一个错误(必须将错误转换为英文)“没有规则来构建目标”example.sh“,从convertToSh需要”。 – homior

+0

要运行,只需键入'make'。它会默认构建makefile中的第一个显式目标(这里是'convertToSh')。或者如果你愿意的话,你可以显式运行'make convertToSh'。 (如果您运行'LANG = C make',则为FYI信息,然后以英文打印。) – MadScientist