我遇到了
make
和 PATH 的问题,我不明白。这是一个独立的演示,其中 make
意外失败:
#!/bin/bash
if [ -d ~/makeTest ]; then
rm -r ~/makeTest ;
fi
mkdir ~/makeTest
cd ~/makeTest
mkdir bin
echo "#!/bin/bash
echo Hello world!" > bin/install.sh
chmod +x bin/install.sh
echo ".PHONY: install
export PATH := \$(HOME)/makeTest/bin:\$(PATH)
install:
@which install.sh
@install.sh" > Makefile
make install
总而言之,此脚本会生成一个
bin
文件夹,其中包含 install.sh
脚本和包含以下内容的 Makefile:
.PHONY: install
export PATH = $(HOME)/makeTest/bin:$(PATH)
install:
@which install.sh
@install.sh
make install
产生输出:
/Users/Suriname0/makeTest/bin/install.sh
make: install.sh: No such file or directory
make: *** [install] Error 1
为什么
which
可以正确地看到 PATH 上的 install.sh 脚本,但实际执行命令却失败并显示“没有这样的文件或目录”?验证 PATH 是否正确更新很容易:添加 @echo $(PATH)
会生成预期的(更新后的)PATH。
感谢您帮助理解此 PATH 问题!
我的猜测是您对路径所做的更改不会影响 shell。为了解决这个问题,我提出了一些更改:
.PHONY: install install2
export PATH := $(HOME)/makeTest/bin:$(PATH)
install:
which install.sh
$(MAKE) install2
install2:
install.sh
我不喜欢这种方法,因为它具有间接性。
.PHONY: install
install:
./bin/install.sh
这是我在开发团队工作多年中看到的解决方案。我喜欢这个解决方案,因为它不会篡改路径,否则可能会导致不良行为。
.PHONY: install
install:
export PATH="${PWD}/bin:${PATH}"; \
install.sh
这个方法也有效。但同样,我不喜欢它,因为它篡改了解决方案 #1 中的路径。但是,如果 bin 目录包含许多可执行文件,则此解决方案比解决方案 #2 效果更好。