制作文件命令

时间:2014-03-04 16:08:00

标签: makefile gnu-make tr

有人可以解释-d< $<之间的字符在以下makefile命令中的作用吗?

tr -d "\`~@#$%^&*=+<>{}[]|/'" < $< | ./$(ANSWER) $(STOPWORDS) | sort > $@ 

这里STOPWORDS是一个带有单词的文件,ANSWER是一个可执行文件。

2 个答案:

答案 0 :(得分:3)

tr命令从-d指定的文件中删除("\`~@#$%^&*=+<>{}[]|/'")所有列出的字符($<除双引号外)。输出转到answer / stopwords命令,该输出被分类到输出文件中。

它实际上几乎与make无关,只有$<$@make变量。

答案 1 :(得分:2)

tr翻译或删除字符。

传递-d告诉tr它将删除所提供的SET1个字符

“`〜@ $%^&amp; * = +&lt;&gt; {} [] | /'”是要删除的字符集。

<shell redirection个字符

$<one of the automatic make variables,用于标识第一个先决条件的名称

因此,您要删除在给定make规则的第一个先决条件中找到的特定集中的所有字符。

这是一个简单的例子 -

生成文件:

all:text.txt
tr -d "\`~@#$%^&*=+<>{}[]|/'" < $<

现在给出了这个text.txt文件:

$ cat text.txt
huio7&*(njkvlsan7u#%$&*(FHhnjkl

运行make文件,你会看到:

$ make
tr -d "\`~@#^&*=+<>{}[]|/'" < text.txt
huio7(njkvlsan7u%$(FHhnjkl

&*#现在全部丢失。

竖条|pipe character,它将从第一个命令获取输出并将其发送到下一个命令。


您问为什么$%未被移除,答案是因为有一些字符使得特殊处理。看一下命令的实际输出:

$ make
tr -d "\`~@#^&*=+<>{}[]|/'" < text.txt

make实际执行的行不包括$%,因为make识别了没有的特殊字符用它们转义字符(反斜杠)。例如,让我们逃避%

新的Makefile:

all:text.txt
tr -d "\`~@#$\%^&*=+<>{}[]|/'" < $<

现在运行此命令,我们看到:

$ make
tr -d "\`~@#\%^&*=+<>{}[]|/'" < stupid_text.txt
huio7(njkvlsan7u$(FHhnjkl

了解%如何在make输出中显示,字符串现已删除了%