首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从makefile执行复杂的shell命令

从makefile执行复杂的shell命令
EN

Stack Overflow用户
提问于 2013-04-13 03:33:20
回答 1查看 19.3K关注 0票数 2

我有以下命令行,可以从Linux命令提示符运行:

代码语言:javascript
复制
vi /tmp/test.txt -s <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )

它创建一个临时文件(使用进程替换),其中包含以下vim命令:

代码语言:javascript
复制
:1 s/^\/\/ VERSION: .*$/\/\/ VERSION: $(date)/g

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

代码语言:javascript
复制
// VERSION: Fri Apr 12 21:20:03 CEST 2013
...
...

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

到目前为止,它的工作方式与设计/预期一致。

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

代码语言:javascript
复制
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似乎不喜欢“进程替换”结构<( command )。我不想使用额外的(真实)文件。

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

回答 1

Stack Overflow用户

发布于 2013-04-13 03:45:30

在make食谱中使用$(shell ...)实际上从来都不是正确的。你已经在一个壳里了..。只需直接键入所需的命令即可。尝试使用make $(shell ...)函数只会增加混淆。您必须通过编写$$来避开$

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

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

代码语言:javascript
复制
edit:
        sed -i "1 s,^// VERSION: .*,// VERSION: $$(date)," $(src).cpp

如果您真的想使用vi,则必须执行以下操作:

代码语言:javascript
复制
SHELL := /bin/bash

edit:
        vi '$(src).cpp' -s <( echo ":1 s/^\/\/ VERSION: .*$$/\/\/VERSION: $$(date)/g" )
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15979487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档