您知道您可以在Makefile中更改shell吗?这是真的。我在尝试通过设置shell来使用bash而不是默认的/bin/sh时发现了这一点。
.ONESHELL:bash:shell:=bash bash:#注意:需要双美元符号,因为make替换$Variables export greeting=";‘hola";echo";$${greeting},bash!";
还有什么是可能的呢?我可以使用其他编程语言作为shell吗?可以在Makefile中编写内联Python吗?
请注意,正在设置变量.ONESHELL。通常,让willevaluate在单独的shell中计算每个命令的值,这意味着在本例中,问候语将在第二行中未定义。按照姓氏以Davis-*开头的其他人的建议,将.ONESHELL添加到Makefile的顶部,并撰写有关make的博客,会导致make指令中的多行代码在对Python的单个调用中求值。
将R内联写入Makefile怎么样?请注意添加的.SHELLFLAGS。默认情况下,make运行shell-c";您的\n脚本,\n此处";与R不兼容。要从R中的命令内联运行脚本,可以使用-e:
现在,您可以编写将R和Python语言组合到单个文件🎉中的管道。
数据分析管道通常具有冒险的用户依赖性。Docker让这一切变得容易得多,但是编写docker run…可能会很麻烦。如果我们可以让Docker也作为解释器和写命令在容器内以内联方式执行,会怎么样?
docker:.SHELLFLAGS=run--volume$(Shell Pwd):/workdir--rm--workdir/workdir--entry point/bin/bash ubuntu-c docker:shell:=docker docker:echo";hello,$$(uname-a)!";
再说一次,这是可能的。运行make docker将运行ECHO.。在运行Ubuntu的Dockertainer中。请注意--volume标志,它将挂载当前工作目录作为容器的工作目录,这意味着可以在您的本地文件系统和容器的本地文件系统之间读取/创建文件。所以构建构件可以在make指令之间共享。
您好,Linux 453c728113d6 4.19.76-linuxkit#1 SMP Fri Apr 3 15:53:26 UTC 2020 x86_64 GNU/Linux!
这是一次实验,目的是看看Make能做些什么。但它的动机是一个现实世界的问题:我经常需要组合跨编程语言和环境的工具来运行数据分析管道。我喜欢把事情自动化,Make是这样做的一个很好的工具。将所有内容内联起来更具可读性,并且将所有内容都放在一个文件中意味着我必须在更少的选项卡之间跳转才能理解管道本身。
编写在Docker中执行的命令的能力意味着我不必花费更少的时间来弄清楚如何将一堆依赖项安装到单个容器中,这会随着依赖项数量的增加而变得越来越困难(特别是如果你在生物信息学工作的话)。
注意:其中一些功能只适用于Make 4.+,这是我使用Homebrew安装的。这些示例在使用MacOS Catalina附带的make 3.x时不起作用。
.ONESHELL:.SILENT:main:\Python\ruby\R\bash\docker docker:.SHELLFLAGS=run--rm--entrypoint/bin/bash ubuntu-c docker:shell:=docker docker:echo";hello,$$(uname-a)!";python:shell:=python3 python:greeting=";hello";print(f。)ruby:.SHELLFLAGS:=-e ruby:shell:=ruby ruby:greeting=";laba";put";#{greeting},ruby!";R:.SHELLFLAGS:=-e R:shell:=Rscript R:greeting=";bonjour";message(paste0(greeting,";,R!";))bash:.。*您好";echo";$${greeting},bash!";