【发布时间】: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 <( echo ":1 s/^\/\/ VERSION: .*$/\/\/VERSION: $(date)/g" )
Make 似乎不喜欢“流程替换”构造 <( 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 我的问题中的第一个是正确的。有那么一小会儿,我怀疑是否将其更改为更简单的示例,但我也想包含反斜杠,因为我预计那里也会出现问题。