我想使用scp
将文件复制到服务器。但是我想在makefile中使用我当前的文件夹名作为变量。
我知道我使用$(CURDIR)
获取当前路径,但我的本地路径在远程服务器上不一样。
E.g。我的路径是/Users/obstschale/Documents/Lab2/
,我想将Lab2.tar复制到user@server.au:/home/path/Lab2/
。
copy2server:
echo $(CURDIR)
scp Lab2.tar user@server.au:/home/path/{folder}
我可能需要将$(CURDIR)
管道输入并找到我的最后一个文件夹。
更新:$(CURDIR)
是正确的变量。 $(CURID)
是错误的,至少它对我不起作用。
答案 0 :(得分:16)
我对makefile(GNU Make 3.81)中的反引号语法没有运气,正如Sylvain所描述的那样。如果它对你不起作用,请使用
$(shell basename $(CURDIR))
而不是
`basename $(CURDIR)`
答案 1 :(得分:5)
我尝试了这条规则:
test:
@echo $(CURDIR) # e.g. /tmp/foobar/blafoor/baz
@echo $(notdir $(CURDIR)) # gives "baz" here.
对我来说很好。
也许这不适用,因为notdir
应该
提取每个文件名的非目录部分。
答案 2 :(得分:4)
您可以使用basename
shell命令提取$(CURDIR)
的最后一个组成部分。
copyserver:
folder=`basename "$(CURDIR)"`; scp Lab2.tar user@server.au:/home/path/${folder}
答案 3 :(得分:3)
如果您要删除路径中的最后一个文件夹名称,则有许多内置的makefile函数。有关文件操作的快速概述,请参阅http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_8.html#SEC74。
copytoserver:
scp Lab2.tar user@server.au:/home/path/$(notdir $(CURDIR))
关键项目当然是$(notdir $(CURDIR))
。正如您所发现的那样,$(CURDIR)
包含运行makefile的目录的路径,而不包含最终的'/'。 notdir
功能剥离了文件名中最后一个'/'的所有内容。这最终剥离了除最终目录之外的所有内容。
如果$(CURDIR)
仍有尾随'/',您可以将其删除,以便notdir
函数可以执行您想要的操作:
$(notdir $(patsubst %/,%,$(CURDIR)))
请注意,在这种情况下,间距非常重要,在任何逗号在执行贪婪模式替换时插入空格之前或之后放置一个空格。