有人可以解释-d
和< $<
之间的字符在以下makefile命令中的作用吗?
tr -d "\`~@#$%^&*=+<>{}[]|/'" < $< | ./$(ANSWER) $(STOPWORDS) | sort > $@
这里STOPWORDS是一个带有单词的文件,ANSWER是一个可执行文件。
答案 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输出中显示,字符串现已删除了%
?