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.


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

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

Saya menemukan solusinya: stackoverflow.com/questions/1789594/… harus menambahkan; setelah itu cd lalu jalankan script di baris yang sama.
Ixx
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.