为什么 makefile 中当前目录没有改变?

为什么 makefile 中当前目录没有改变?

我正在尝试运行一个简单的脚本 - 将 git 存储库克隆到某个目录,然后克隆cd到该目录以执行安装脚本。

该脚本位于 Makefile 中。

cd似乎不起作用。它找不到我的安装脚本。

我在脚本中的后面添加了一个 pwd cd,它显示了我执行脚本的目录,而不是我进入的目录cd

有什么问题?

git clone http://somerepo ~/some_dir
cd ~/some_dir/
pwd
python myscript.py install

=>

pwd:/hereIsPathToDirectoryFromWhichIRunTheScript

python:无法打开文件“setup.py”:[Errno 2]没有这样的文件或目录

它也不适用于./setup.py.

如果我输入绝对路径,~/some_dir/setup.py脚本稍后会失败,因为它试图访问同一文件夹中的资源。

答案1

您正在使用 makefile。 Makefile 不是脚本,每一行都在新的 shell 中执行。这意味着当您更改行中的环境(例如cd)时,该更改不会传播到下一行。

解决方案是,当您想要保留命令之间的环境时,可以在同一行中运行所有命令。所有命令都将在同一个 shell 中执行,并且环境将被保留。

例如:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install

答案2

从 GNU make版本 3.82 开始,您可以添加到.ONESHELL:Makefile 的顶部,然后cd folder将按照您的预期进行操作。 阅读文档

答案3

脚本运行在子外壳,这意味着它有自己的$PWD.一旦退出,您就会得到“old” $PWD。如果您想保留$PWD您需要source(也称为。.)脚本而不是运行它。然而,这在 Makefile 中不起作用,因为每个命令在单独的子 shell 中运行:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user

相关内容