【问题标题】:How to write a Makefile to copy scripts to server如何编写 Makefile 将脚本复制到服务器
【发布时间】:2013-10-22 05:34:56
【问题描述】:

在本地机器上完成脚本编写后,我需要将它们复制到集群中以执行代码。例如,我想将当前目录中的所有 matlab 文件复制到服务器 id@server 的目录中。

谁能帮助编写一个非常基本的 Makefile 来实现这个目的?

非常感谢!

约翰

【问题讨论】:

  • 堆栈溢出不是让其他人为您编写脚本的地方; what have you tried?
  • 我不是说要写剧本。我只想要一个我可以遵循和修改的顶级脚本。

标签: bash makefile


【解决方案1】:

这是 Jens 的答案以及我的答案 here 的改编,它利用 Make 的功能仅复制自上次将文件复制到服务器以来已修改的那些文件。这样,如果您有数百个 .m 文件并且您修改其中一个,您就不会将它们全部复制到服务器。

它使用了一个空的隐藏文件.last_push,它仅用于记录(通过它自己的时间戳)我们上次将文件复制到服务器的时间。

FILES = $(shell find . -name *.m)
SCP = scp id@server:path/relative/to/your/serverhomedir
LAST_PUSH = .last_push

.PHONY : push
push : $(LAST_PUSH)

$(LAST_PUSH) : $(FILES)
    $(SCP) $?
    touch $(LAST_PUSH)

使用makemake push 运行它。关键是变量$?,其中填充了比目标更新的所有先决条件的列表 - 在本例中,是比上次推送更新的.m 文件列表。

【讨论】:

  • 这里$(SCP) $?不展开成scp $external_url_with_path $modified_file1 $modified_file2之类的吗?因为如果是这样,它不会推动 - 它会拉动。还是我错过了什么。
【解决方案2】:

如何将文件复制到服务器?假设你有 ssh/scp 可用:

FILES = file1 file2 *.matlab
copy:
     scp $(FILES) id@server:path/relative/to/your/serverhomedir

运行

$ make copy

作为一个 shell 脚本,它可能如下所示:

#!/bin/sh
set -- file1 file2 *.matlab
scp "$@" id@server:path/relative/to/your/serverhomedir

别忘了chmod u+x yourscript

【讨论】:

  • Jens,如果你用这种方式编写 makefile,那么使用 makefile 完全没有意义——你的 makefile 确实是一个 shell 脚本,应该使用脚本。
  • 假设我编写了一个名为 copyscript 的文件,其内容为: FILES = file1 file2 *.matlab copy: scp $(FILES) id@server:path/relative/to/your/serverhomedir 然后运行脚本为./文案?这是正确的方法吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多