makefileの現在のディレクトリが変更されないのはなぜですか?

makefileの現在のディレクトリが変更されないのはなぜですか?

簡単なスクリプトを実行しようとしています。 gitリポジトリをディレクトリに複製し、cdそのディレクトリに複製してインストールスクリプトを実行します。

スクリプトはMakefileにあります。

しかし、cdうまくいかないようです。私のインストールスクリプトが見つかりません。

後でスクリプトにパスワードを追加しましたが、ここに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 はスクリプトではなく、各行は新しいシェルで実行されます。これは、行内の環境を変更すると(たとえば、cd)変更が次の行に伝播されないことを意味します。

解決策は、コマンド間のコンテキストを維持したい場合は、同じ行ですべてのコマンドを実行することです。すべてのコマンドは同じシェルで実行され、環境は保存されます。

たとえば、

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

答え2

GNUバージョン3.82以降、Makefileの先頭にmake追加でき、期待どおりに機能します。 .ONESHELL:cd folder文書を読む

答え3

スクリプトは以下で実行されます。サブシェルつまり、$PWD終了すると「古い」状態になります$PWD$PWD必要なsource(別名.)スクリプトを実行する代わりに維持したい場合。しかし、これはMakefileでは動作しません。注文する別のサブシェルで実行:

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

関連情報