我正在尝试运行一个简单的脚本 - 将 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