我有一个非常简单的Makefile
正在做source
来设置ENV变量。但如果我从Makefile
我收到此错误
make dev
source ./bin/authenticate.sh
make: source: No such file or directory
make: *** [dev] Error 1
该脚本存在。
如果我在命令行中运行它,它可以工作。
source ./bin/authenticate.sh
Works!
这是我的Makefile
test:
pytest -s
dev:
source ./bin/authenticate.sh
我正在使用OSX。我不确定这是否会产生影响。
答案 0 :(得分:3)
tldr;失去let nib = UINib(nibName: "MessageTableViewCell", bundle: nil)
tableView.register(nib, forCellReuseIdentifier: "messageTableViewCell")
,使用点(source
)
更多解释如下...
这不起作用,因为.
在make
中寻找source
程序。之所以失败,是因为$PATH
是内置的(非POSIX)外壳程序,而不是任何常规的类似UNIX的系统上的可执行程序。
我能够复制问题中显示的失败;在Ubuntu 16.04上使用GNU Make v4.1生成了以下(非常删节的)输出:
source
您可以看到$ strace -f -s65536 -- make dev 2>&1 | grep 'authenticate'
read(3, "test:\n\tpytest -s\n\ndev:\n\tsource ./bin/authenticate.sh\n", 4096) = 53
write(1, "source ./bin/authenticate.sh\n", 29source ./bin/authenticate.sh
[pid 32100] execve("/usr/local/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/local/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/usr/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/sbin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
[pid 32100] execve("/bin/source", ["source", "./bin/authenticate.sh"], [/* 82 vars */]) = -1 ENOENT (No such file or directory)
六次失败的尝试来找到make
程序;即我的source
的每个组成部分一个。
如果将$PATH
更改为source
,则.
会更改其策略;而不是尝试查找和执行程序,它只是将规则主体传递给系统外壳程序:
make
$ strace -f -s65536 -- make dev 2>&1 | grep 'authenticate'
read(3, "test:\n\tpytest -s\n\ndev:\n\t. ./bin/authenticate.sh\n", 4096) = 48
write(1, ". ./bin/authenticate.sh\n", 24. ./bin/authenticate.sh
[pid 32122] execve("/bin/sh", ["/bin/sh", "-c", ". ./bin/authenticate.sh"], [/* 82 vars */]) = 0
[pid 32122] open("./bin/authenticate.sh", O_RDONLY) = 3
使用的shell类型决定了每个make
规则中扩展哪些shell内置函数。您可以像这样告诉Makefile
使用您选择的外壳:
make
由于$ cat Makefile
SHELL = /bin/bash
test:
pytest -s
dev:
source ./bin/authenticate.sh
将内置bash
定义为source
的同义词,因此使用.
的规则现在成功了:
source
参考文献:
答案 1 :(得分:0)
做cd bin && source authenticate.sh
它有效