Geçerli dizin makefile içinde neden değişmiyor?


14

cdBir kurulum komut dosyası yürütmek için belirli bir dizine, sonra bu dizine basit bir komut dosyası klon git git deposu çalıştırmak için çalışıyorum .

Bu script Makefile dilinde.

Ama cdgörünüşe göre çalışmıyor. Kurulum betiğimi bulamıyor.

cdKomut dosyasından sonra bir pwd ekledim ve bana komut dosyasını yürüttüğüm dizini gösteriyor, cdiçine girdiğim dizini değil .

Sorun ne?

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

=>

pwd: /hereIsPathToDirectoryFromWhichIRunTheScript

python: 'setup.py' dosyası açılamıyor: [Errno 2] Böyle bir dosya veya dizin yok

Aynı zamanda çalışmaz ./setup.py.

Mutlak yolu girersem ~/some_dir/setup.py, komut dosyası daha sonra başarısız olur çünkü aynı klasördeki kaynaklara erişmeye çalışır.


"Alias ​​mycd = 'cd some_dir'; mycd" gibi bir şey deneyebilir misin
alpert

Bu işe yaramaz:/bin/sh: mycd: command not found
Ixx

Çözümü buldum: stackoverflow.com/questions/1789594/… bir eklemek zorunda kaldı; cd'den sonra komut dosyasını aynı satırda yürütün.
Ixx

Yanıtlar:


36

Bir makefile kullanıyorsunuz. Makefiles komut dosyası değildir, her satır yeni bir kabukta yürütülür. Yani çevreyi satır (örneğin) olarak cddeğiştirdiğinizde, bu değişiklik bir sonraki satıra yayılmaz.

Çözüm, komutlar arasındaki ortamı korumak istediğinizde, tüm komutları aynı satırda çalıştırmanızdır. Ardından tüm komutlar aynı kabukta yürütülür ve ortam korunur.

Örneğin:

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

Ayrıca güncellenmiş bir cevap için bu gönderiye bakın .
Şubat'ta

0

Bir komut dosyası alt kabukta çalıştırılır , yani kendi alt dizisi vardır $PWD. Bir kez o "eski" olsun $PWD. Eğer saklamak $PWDistiyorsanız , komut dosyasını çalıştırmak yerine source(aka. .) Gerekir . Bununla birlikte, bu bir Makefile'de çalışmaz, çünkü her komut ayrı bir alt kabukta çalıştırılır:

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

Çözümü buldum: stackoverflow.com/questions/1789594/… bir eklemek zorunda kaldı; cd'den sonra komut dosyasını aynı satırda yürütün.
Ixx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.