【问题标题】:Execute complex shell command from makefile从 makefile 执行复杂的 shell 命令
【发布时间】:2013-04-12 19:33:19
【问题描述】:

我有以下在 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 &lt;( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

Make 似乎不喜欢“流程替换”构造 &lt;( command )。我不想使用额外的(真实的)文件。

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

【问题讨论】:

  • 请添加您遇到的错误。当您将命令放入 Makefile 时会发生什么? $(shell 应该不是必需的。
  • 你想要哪个命令,:1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g:3,30 d|:1
  • @ExP 将信息添加到问题中
  • @Beta 我的问题中的第一个是正确的。有那么一小会儿,我怀疑是否将其更改为更简单的示例,但我也想包含反斜杠,因为我预计那里也会出现问题。

标签: linux makefile gnu-make


【解决方案1】:

在 make 配方中使用 $(shell ...) 几乎是不正确的。你已经在 shell 中了……只需直接输入你想要的命令。尝试使用 make $(shell ...) 函数只会增加混乱。你必须通过写$$来逃避$

您还有另一个问题:make 总是使用/bin/sh 调用其脚本,而您使用的是特定于 bash 的构造 (&lt;(...))。

当然,更大的问题是您为什么要使用可视化编辑器 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" )

【讨论】:

  • 我想使用vi,因为我想从那时起手动编辑文件。如果我不打算手动编辑文件的其余部分,我不想保存时间戳已更改的文件。
  • 让 make 目标调用交互式命令有点奇怪。不过,只要您不尝试使用make -j,它就可以工作。但是你不能使用我上面提到的 bash 结构。您要么必须使用真正的临时文件,要么将 SHELL := /bin/bash 添加到您的 makefile 以强制 make 使用 bash 而不是 /bin/sh。
  • 我知道我误用了 make 一点。我的想法是,我只需键入make editmake flashmake fuses,就可以对源代码执行任何所需的操作...顺便说一句,您的提示似乎有效。我看到这实际上是一个 shell 问题 :)
猜你喜欢
  • 1970-01-01
  • 2017-07-09
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2023-03-22
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多