Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在GNU make函数中交换两个文件?_Shell_Unix_Makefile_Gnu - Fatal编程技术网

Shell 如何在GNU make函数中交换两个文件?

Shell 如何在GNU make函数中交换两个文件?,shell,unix,makefile,gnu,Shell,Unix,Makefile,Gnu,我想在运行Makefile中的uninstall目标时使用函数/宏交换两个文件 以下是我所拥有的,仅保留其中一个文件并删除另外两个: swap = mv $(1) $(3); mv $(2) $(1); mv $(3) $(2) uninstall: @$(call swap,`printf "%s\n" $(FILE).* | sort -r | sed -n 1p`,\ $(FILE),$(shell mktemp $(FILE).XXX)) 如果您知道要交换哪些文件

我想在运行Makefile中的
uninstall
目标时使用函数/宏交换两个文件

以下是我所拥有的,仅保留其中一个文件并删除另外两个:

swap = mv $(1) $(3); mv $(2) $(1); mv $(3) $(2)

uninstall:
    @$(call swap,`printf "%s\n" $(FILE).* | sort -r | sed -n 1p`,\
      $(FILE),$(shell mktemp $(FILE).XXX))

如果您知道要交换哪些文件,可以尝试以下方法。我假设要交换的对是
fooXXX,barXXX

define SWAP_files
swap_$(1):
    @temp=$$(shell mktemp temp.XXXXXX); \
    to_swap_with=$$(patsubst foo%,bar%,$(1)); \
    mv $(1) $$$$temp; \
    mv $$$$to_swap_with $(1); \
    mv $$$$temp $$$$to_swap_with

uninstall: swap_$(1)
endef

$(foreach foo,$(FOOS),$(eval $(call SWAP_files,$(foo))))
Foreach
fooXXX
文件它实例化了一个规则:

swap_fooXXX:
    @temp=$(shell mktemp temp.XXXXXX); \
    to_swap_with=$(patsubst foo%,bar%,fooXXX); \
    mv fooXXX $$temp; \
    mv $$to_swap_with fooXXX; \
    mv $$temp $$to_swap_with
还有一条规则:

uninstall: swap_fooXXX

您没有在任何地方运行
mktemp
命令。试试
@set-x$(调用…)
查看实际运行的内容。这应该对你有帮助。从我的编辑器复制粘贴时出现本地错误。我试着使用
记号
$(shell…
)。我已经更新了这个示例。上面的函数实际上可以工作,如果我只是
$(调用1,2,3)
,问题就出在
mktemp
的某个地方。
$(shell)
是该位置的错误时间,但这与问题无关(它发生在配方扩展时,而不是该配方行的运行时)。你可以做的另一件事是停止玩这个游戏,只使用一个符号链接,你可以自动交换出去。