Saya mencoba menjalankan skrip sederhana - klon repositori git ke direktori tertentu, kemudian cd
ke direktori ini untuk menjalankan skrip instalasi.
Script ini ada dalam Makefile.
Tapi cd
sepertinya tidak berhasil. Tidak menemukan skrip instalasi saya.
Saya menambahkan pwd setelah cd
skrip, dan itu menunjukkan kepada saya direktori dari mana saya mengeksekusi skrip, bukan direktori tempat saya cd
masuk.
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.
make
cd-command
Ixx
sumber
sumber
/bin/sh: mycd: command not found
Jawaban:
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:
sumber
Sebuah skrip dijalankan dalam sebuah subkulit , yang artinya memiliki skrip sendiri
$PWD
. Setelah keluar Anda mendapatkan "lama"$PWD
. Jika Anda ingin menyimpan skrip yang$PWD
Anda butuhkansource
(alias..
) Alih-alih menjalankannya. Namun, ini tidak akan berfungsi di Makefile, karena setiap perintah dijalankan dalam subkulit yang terpisah:sumber