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

Ixx*_*Ixx 18 make cd-command

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

此脚本位于 Makefile 中。

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

cd在脚本中的之后添加了一个密码,它向我显示了我执行脚本的目录,而不是我cd进入的目录。

有什么问题?

git clone http://somerepo ~/some_dir
cd ~/some_dir/
pwd
python myscript.py install
Run Code Online (Sandbox Code Playgroud)

=>

pwd/hereIsPathToDirectoryFromWhichIRunTheScript

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

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

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

phe*_*mer 46

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

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

例如:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Run Code Online (Sandbox Code Playgroud)


小智 5

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


l0b*_*0b0 1

脚本在子 shell中运行,这意味着它有自己的$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
Run Code Online (Sandbox Code Playgroud)