linux - 从 makefile 执行复杂的 shell 命令

标签 linux makefile gnu-make

我有以下在 Linux 命令提示符下运行的命令行:

vi /tmp/test.txt -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

它创建一个包含以下内容的临时文件(使用流程替换)vim命令:

:1 s/^\/\/ VERSION: .*$/\/\/ VERSION: $(date)/g

它打开文件 /tmp/test.txt用于编辑和执行先前创建的临时文件中的命令。它找到第 1 行并用当前时间戳替换该行。它看起来有点像这样:

// VERSION: Fri Apr 12 21:20:03 CEST 2013
...
...

接下来我可以进行任何需要的编辑,只有当我决定保存文件时,所有更改才会提交到磁盘。不能先更改磁盘上的文件,然后启动编辑器,因为文件将具有不同的时间戳,而内容本身没有更改。

到目前为止,它按设计/预期工作。

现在我试图将这个 vi 命令行移动到一个 make 文件中,但我失败了。我尝试了 $(shell .....)构造,但 make 向我抛出错误。

edit:
        $(shell vi $(src).cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

我正在尝试弄清楚 Makefile 中的行应该如何读取带有额外引号和括号的摆弄,但我还没有解决它。

我正在运行 Ubuntu Linux 12.10 和 GNU Make 3.81

vi project.cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

Make 似乎不喜欢“Process Substitution”结构 <( command ) .我不想使用额外的(真实的)文件。

€ make edit
vi project.cpp -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )
/bin/sh: 1: Syntax error: "(" unexpected
make: *** [edit] Error 2

最佳答案

使用 $(shell ...)制作食谱的内部几乎永远不会正确。您已经在 shell 中了……只需直接键入您想要的命令即可。尝试使用品牌 $(shell ...)功能只会增加困惑。你将不得不逃离$通过写作 $$ .

您还有另一个问题:make始终使用 /bin/sh 调用其脚本并且您正在使用特定于 bash 的构造 ( <(...) )。

当然,更大的问题是为什么您要使用可视化编辑器 vi 来执行这样的自动更改,而不是例如 sed这是为它设计的。我将其重写为:

edit:
        sed -i "1 s,^// VERSION: .*,// VERSION: $$(date)," $(src).cpp

如果你真的想使用 vi,你必须这样做:

SHELL := /bin/bash

edit:
        vi '$(src).cpp' -s <( echo ":1 s/^\/\/ VERSION: .*$$/\/\/VERSION: $$(date)/g" )

关于linux - 从 makefile 执行复杂的 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979487/

相关文章:

c - Make 忽略隐式规则依赖

c# - 在 windows 和 mono linux 平台上显示 RGB 图像

linux - pkill 掩码如何工作?

linux - 设备树 - 探测驱动程序并避免竞争条件

makefile - 从 makefile 中的字符串中删除前两个字符?

cmake - 将 CMake 与 GNU Make 结合使用 : How can I see the exact commands?

linux - 打印文件中的最后一个字段并将其用作另一个文件的名称

linux - 为 CUDA 程序构建 make 文件时出现库错误

qt4 - Qt4书说“发布”,现实不同意

unix - 在Makefile中的文件名中转义冒号