2012-04-05 17 views
5


Genellikle dizine özgü ayarları .bashrc içinde tutuyorum ve dizin değiştirdiğimde bu ayarları etkin hale getirmek için source .bashrc komutunu çalıştırıyorum.
Şimdi, cd komutunu ~/.bashrc'da manipüle etmeyi düşünüyordum, böylece yeni dizine her cd koyduğumda ve herhangi bir .bashrc varsa, otomatik olarak yüklenecektir.cd komutunu özelleştirme

Benzer şekilde cd $1; source .bashrc (Ben 1 $ geçerli bir yol olduğunu doğruladım), ama sorun kabuktur, bu yüzden bir özyinelemeli döngüdür (cd her zaman değiştirilmiş cd işaret eder). CD'nin elf dosyasına sahip değiliz (genelde diğer komutlardan viz scp veya başkalarına sahibiz). Peki bunu nasıl başarabilirim? Ayrıca, shopt -s cdspell destekleniyorsa, ayrıca $ 1 argümanında cd yazım yoluna sahip olmam gerekiyor.

+0

Neden insanlar onu kapatıyor? Bu başka bir iş parçacığı için yinelenen, sanmıyorum. Ya da 100K veya 900K itibarı olan insanlar nedeniyle cevap verme şansı bulamadı mı? – peeyush

cevap

6

"Yerleşik" komutunu istersiniz;

yerleşik kabuk yerleşik [argümanlar]

argüman geçen , belirtilen kabuk yerleşiği Yürütme, ve çıkış durumu döner. Bu işlev, isminin kabuk yerleşimi ile aynı işlevi tanımlayan işlevi olduğunda, işlev içinde yerleşimin işlevini koruyan için kullanışlıdır. CD yerleşiği, genel olarak bu şekilde yeniden tanımlanmıştır. shell-builtin, shell builtin komutu değilse, dönüş durumu false olur.

Gönderen: Yani http://linux.die.net/man/1/bash

, siz (denenmemiş, ya kullanışlı bir yumruk yok) gibi bir şey olabilir;

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; then 
     [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; 
     __rvm_do_with_env_before; 
     __rvm_project_rvmrc; 
     __rvm_after_cd; 
     __rvm_do_with_env_after; 
     return 0; 
    else 
     return $?; 
    fi 
} 

Ve evet, bu benim makinede çalışır:

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

serin :-) 'cdd'. (Neden 15 karakter sınırlıdır?) – peeyush

+1

"-e" den önce "test" e ihtiyacınız var. – l0b0

+0

Teşekkürler, düzeltildi. –

0

Bu deneyebilirsiniz:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; } 
alias cd = 'cdd' 
? 

ancak bu kadar test vermedi.

+0

sorunu aynıdır, bu yeni cd tanımına tekrar tekrar çağrı. – peeyush

+0

Bunu aşağıdaki varyantta test ettim: işlevi cdd() { cd $ 1; [-e ./.bashrc]; sonra yankı "Merhaba, orada!"; fi } takma cd = Sonra istemi> cd Merhaba, orada – begemotv2718

1

RVM bunu yapar. Aslında, @RoryHunter dediği gibi, builtin kullanın ve başarılı olursa bir kod çalıştırın veya başarısız olursa çıkış kodunu döndürün.

2

Muayeneyi kontrol edebilirsiniz. https://github.com/zimbatm/direnv

+0

Tasarladığım belirli hedeflerden biri, RVM'nin yaptığı gibi yerleşik komutları geçersiz kılmaktan kaçınmaktı (did?). Bunun yerine, dizin değişiklikleri saptamak için bash'ta PROMPT_COMMAND gibi kabuk kancalarına bağlı. – zimbatm