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.