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


14

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

该脚本在Makefile中。

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

cd在脚本中的后面添加了pwd ,它向我显示了我执行脚本的目录,而不是我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,脚本稍后将失败,因为它试图访问同一文件夹中的资源。


您可以尝试以下方式:“ alias mycd ='cd some_dir'; mycd”
alpert

那行不通:/bin/sh: mycd: command not found
Ixx

我找到了解决方案:stackoverflow.com/questions/1789594/…必须添加; cd之后,然后在同一行中执行脚本。
Ixx

Answers:


36

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

解决方案是,要保留命令之间的环境,请在同一行中运行所有命令。然后,所有命令将在同一外壳中执行,并保留环境。

例如:

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

另请参阅此帖子以获取更新的答案。
mloning

0

脚本在子shell中运行,这意味着它具有自己的脚本$PWD。一旦退出,您将获得“古老”的声誉$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

我找到了解决方案:stackoverflow.com/questions/1789594/…必须添加; cd之后,然后在同一行中执行脚本。
Ixx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.