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、2014

回答:


36

メイクファイルを使用しています。Makefileはスクリプトではなく、各行が新しいシェルで実行されます。ラインなどの環境を変更すると(のようにcd)、その変更は次のラインに伝播されません。

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

例えば:

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

更新された回答については、この投稿も参照してください。
mloning

0

スクリプトはサブシェルで実行され$PWDます。つまり、スクリプトには独自のスクリプトがあります。それが終了すると、「古い」ものが表示され$PWDます。保持したい場合は、スクリプトを実行する代わり$PWDsource(別名.)スクリプトを実行する必要があります。ただし、各コマンドは個別のサブシェルで実行されるため、Makefileでは機能しません。

$ 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、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.