Mengapa direktori saat ini tidak berubah di makefile?

14

Saya mencoba menjalankan skrip sederhana - klon repositori git ke direktori tertentu, kemudian cdke direktori ini untuk menjalankan skrip instalasi.

Script ini ada dalam Makefile.

Tapi cdsepertinya tidak berhasil. Tidak menemukan skrip instalasi saya.

Saya menambahkan pwd setelah cdskrip, dan itu menunjukkan kepada saya direktori dari mana saya mengeksekusi skrip, bukan direktori tempat saya cdmasuk.

Apa masalahnya?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: tidak dapat membuka file 'setup.py': [Errno 2] Tidak ada file atau direktori tersebut

Ini juga tidak berfungsi ./setup.py.

Jika saya memasukkan path absolut ~/some_dir/setup.py, skrip gagal nanti karena mencoba mengakses sumber daya di folder yang sama.

Ixx
sumber
Bisakah Anda mencoba sesuatu seperti: "alias mycd = 'cd some_dir'; mycd"
alpert
Itu tidak berhasil:/bin/sh: mycd: command not found
Ixx
Saya menemukan solusinya: stackoverflow.com/questions/1789594/… harus menambahkan; setelah itu cd lalu jalankan script di baris yang sama.
Ixx

Jawaban:

36

Anda menggunakan makefile. Makefile bukan skrip, setiap baris dieksekusi di shell baru. Berarti ketika Anda mengubah lingkungan sejalan (seperti cd), perubahan itu tidak disebarkan ke baris berikutnya.

Solusinya adalah ketika Anda ingin menjaga lingkungan antara perintah, Anda menjalankan semua perintah di baris yang sama. Semua perintah kemudian akan dieksekusi di shell yang sama, dan lingkungan dipertahankan.

Sebagai contoh:

target:
    git clone http://somerepo ~/some_dir
    cd ~/some_dir/ && python myscript.py install
Patrick
sumber
Lihat juga posting ini untuk jawaban yang diperbarui.
Mloning
0

Sebuah skrip dijalankan dalam sebuah subkulit , yang artinya memiliki skrip sendiri $PWD. Setelah keluar Anda mendapatkan "lama" $PWD. Jika Anda ingin menyimpan skrip yang $PWDAnda butuhkan source(alias. .) Alih-alih menjalankannya. Namun, ini tidak akan berfungsi di Makefile, karena setiap perintah dijalankan dalam subkulit yang terpisah:

$ pwd
/home/user
$ cat test.sh
cd /
$ cat Makefile
test:
    . ./test.sh && pwd
    pwd
$ make test
. ./test.sh && pwd
/
pwd
/home/user
l0b0
sumber
Saya menemukan solusinya: stackoverflow.com/questions/1789594/… harus menambahkan; setelah itu cd lalu jalankan script di baris yang sama.
Ixx