Bash, .bashrc içindeki bu satır nedeniyle başlamak için yavaştır. Buna ne sebep olabilir?


19

Dosyamda .bashrcbu efekte bir satır var:

alias prog="/path/to/script.sh $(find $(pwd) -name prog)"

Bu çizgiyi yorumladığımda, Bash yeni bir terminal açtığımda neredeyse anında başlıyor. Bu çizgi ile imlecim görünmeden önce 4-5 saniyelik bir gecikme olur.

İç içe yerleştirilmiş komutların $(pwd)vb. Kaldırılması da onu hızlandırır. Bu neden oluyor? Yuvalanmış komutları yine de bir şekilde kullanabilir miyim?


4
Sorun, findönyükleme zamanında yürütülen ve dizin yapısına bağlı olarak yürütülmesi uzun süre alabilen komuttur. Eğer çift tırnak yerine tekli- findkullanırsanız alias, çağrıldığında çalıştırılırken çalıştırılır . Hangi çalışma dizinini kullanmak istediğinize, bildirim zamanında veya çalışma zamanında geçerli olana bağlıdır. Bu arada $(pwd)oldukça verimsiz ifade etmek yoludur .ya $PWD.
AFH

15
Sorduğun şey bu değil, ama bu XY problemine çok benziyor . Komut dosyasını neden kullanarak bulmanız gerekiyor find? Bir kez yükledikten sonra, nerede olduğunu biliyorsunuz. Sık sık güncelleyip adını değiştirseniz bile, ona sabit bir adla erişilebilmesi için sembolik bir bağlantı sağlayabilirsiniz.
sleske

5
@AFH Lütfen cevapları yorum olarak değil, cevap olarak gönderiniz.
David Richerby

1
@DavidRicherby - Bunun gerçekten göndermeden önce cevap olduğundan emin olmak istedim. Senaryo keyfi bir dizinde bulunan dosyalar üzerinde çalışacak şaşkın.
AFH

Yanıtlar:


45

Komut ikamesi çift tırnak içinde olduğundan, komutun tanımlandığı zamanda değerlendirilir. Bu , çalışırken findsabit disk içeriğinize bakmanıza neden olur .bashrc.

Bunun aksine, kullanım sırasında değerlendirilmesini istersiniz. Bu durumda, tek tırnak kullanın:

alias prog='/path/to/script.sh $(find "$(pwd)" -name prog)'

Bulunan dosyalardan herhangi birinin adlarında boşluk varsa, bu takma adın başarısız olacağını unutmayın. Bundan kaçınmak için:

alias prog='find . -name prog -exec /path/to/script.sh {} +'

Bu ikinci form, her türlü dosya adı için güvenilir bir şekilde çalışacaktır.


1
'kullanım süresi'. Ve ikinci hattınız bir alt kabuk ortaya çıkmasını önler.
rleir

11
Bunlara karşın, şimdi yazdığınız her zaman prog, finddaha önce oysa bu (kabuk başlangıçta) sadece bir kez çalıştırmak olacaktır, koşmak gerekecektir.
el.pescado

Sonra tekrar, dosya önbellekleme sayesinde, ikinci kez aynı çalıştırdığınızda findgenellikle çok daha hızlıdır.
reinierpost

21
@ el.pescado Yukarı tarafta, amaçlanan davranışın, komutu işlemek için var olan dosyalardan ziyade, kullanıcının oturum açtığı sırada varolan dosyalarda komutu çalıştırmak olduğunu hayal etmek zordur.
David Richerby

2
@DavidRicherby Belki eski yol artık yoksa yolunu önbelleğe alabilir progve yeniden çalıştırabiliriz find?
Alex Vong
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.