Bash 如何在Makefile中转义特殊字符(如\n)

Bash 如何在Makefile中转义特殊字符(如\n),bash,makefile,Bash,Makefile,我有一个makefile,它将一些typescript编译成JavaScript,并在其顶部添加一行“#!/usr/bin/env node”。 我做最后一件事的方式,自动取款机,就是用这条线 echo "#!/usr/bin/env node\n$$(cat javascriptFile)" > javascriptFile;\ 但我注意到的是,在JavaScript中有\n、\t或类似内容的任何地方,它都会被分别转换为换行符或制表符 这就产生了一些问题。假设我有一个文本字符串“这是

我有一个makefile,它将一些typescript编译成JavaScript,并在其顶部添加一行“#!/usr/bin/env node”。 我做最后一件事的方式,自动取款机,就是用这条线

 echo "#!/usr/bin/env node\n$$(cat javascriptFile)" > javascriptFile;\
但我注意到的是,在JavaScript中有\n、\t或类似内容的任何地方,它都会被分别转换为换行符或制表符

这就产生了一些问题。假设我有一个文本字符串“这是一个\n字符串”。 结果是

“这是一个
“字符串”

这是无效的JavaScript


我要寻找的是在执行$$(cat文件)时保留这些\n和\t的方法

这与make无关;如果在shell提示符中运行该命令,同样的情况也会发生

问题是外壳接收cat的输出并将其传递给echo。Echo将自动转换所有这些字符,这就是它们被转换的原因(请参阅Echo的手册页)

此外,您不能对文件进行cat并将其重定向到同一个文件

让echo打印除最简单文本以外的任何内容都是一个非常糟糕的主意。你应该像这样重写你的食谱:

( echo '#!/usr/bin/env node' ; cat javascriptFile ) > newJavascriptFile
mv newJavaScriptFile javascriptFile

似乎只有使用
-e
选项才能
echo
。您确实提出了一个关于“echo$(cat file)>文件”的好观点,尽管这并不能回答我如何避免echo将“\n”转换为换行符,或者提供了一种在不转换两行新行的情况下写入文件的替代方法。谢谢。我不明白你的评论。在我的例子中,我向你展示了如何获得你想要的行为。为什么要使用cat生成文件的输出,在命令行上将其传递给echo,然后让echo打印出来?那是很多不必要的工作,会引起很多问题。为什么不让cat直接打印出来,就像我在回答中所说的那样?echo的行为没有标准化,因此没有可移植的方式来做您想要做的事情。bash内置版本的echo支持-E标志(运行
帮助echo
)。但是,如果您抑制\n,那么您想要的标志(在
#!/usr/bin/env节点之后)也将被抑制。