Komut satırında yerleşik “cd” komutunu geçersiz kılmak mümkün müdür?


22

Hemen hemen her makinemdeki farklı bir dizine 'cd' yaptığımda (bu durumda, Mac OS X 10.6.7 çalıştırarak) komut satırı üzerinden (bash) hemen içeriğini almak için hemen 'ls' yazdım bu dizinde. İstenilen dizine geçmesi için 'cd' yi geçersiz kılmanın bir yolunu bulmaya çalışıyorum ve ardından listeyi bana tek seferde veriyor.

~ / .Bash_profile dosyasına eklenmiş aşağıdaki satırla çalışarak aradığım temel işlevselliği elde edebildim

function cl() { cd "$@"; ls -l; }

Bu beklendiği gibi çalışır. İstenen dizine geçip ardından içeriğini gösterme. Bir sorunla karşılaştığım yerde yeni bir "cl" komutu oluşturmak yerine "cd" yi geçersiz kılmaya çalışıyor.

Aşağıdaki şeyler yapma işi

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

Ayrıca çalışmayan 'cl' işlevine işaret eden bir diğer ad oluşturmanın yanı sıra listede olmayan birkaç diğer yinelemeyi de denedim. Hiçbiri işe yaramadı.

Dokümantasyonda okuduklarım, 'cd' nin harici bir komut olarak çalıştırılamadığı gerçeğinden bahsediyor (fonksiyonun onu kullanması gereken şekilde anlıyorum).

Böylece şu anda "cl" komutumu kullanabilir ve istediğimi elde edebilirim, ancak soru şu / kalır:

İstenilen dizinde değişiklik yapması ve daha sonra başka bir şey yapması için 'cd' davranışını geçersiz kılmanın bir yolu var mı?

Yanıtlar:


30

Aşağıdakilerin çalışması gerekir:

function cd() { builtin cd "$@" && ls -l; }

İşlev tek bir satırda olduğundan, ;doğru çalışması için yukarıdaki gibi sonlandırıldığından emin olun.


Parametresiz arama için çalışmıyor.
Daniel Beck

3
@DanielBeck - en azından Mac OSX'imde (10.6.7) bu parametresiz bir çağrı ile iyi çalışıyor. Davranış, ana dizine değişiyor ve sonra bu dizinin listesini yapıyor. Sonunda eklenen yeni özellik ile eski "cd" nin işlevselliğini etkin bir şekilde çoğaltma.
Alan W. Smith

2
@Alan Doğru, bu kodu geçici olarak kabuğun içine yazarak test ettim. cd ""(Bu cevabın neyi değerlendirmesi gerektiği cd "$@"konusunda boş olandan farklı) davranışı gibi görünüyor $@. Karışıklık için üzgünüm.
Daniel Beck

@DanielBeck - endişelenme.
Alan W. Smith,

2
Not: Soruyu tam olarak cevapladığım için bunu kabul edilen cevap olarak değiştiriyorum. @RichHomolka tarafından yazılan, anaparayı ele almak için mükemmeldir, ancak bu tam olarak ~ / .bash_profile dosyanıza yerleştirilebilecek olan şeydir.
Alan W. Smith,

10

Bence bir döngüye giriyorsun. Sizin cdfonksiyonu çağırıyor cdolduğunu ... işlevi.

builtinKomutu aramanıza neden olan bir anahtar kelimenin hangisi olduğunu bilmeniz gerekir.

function cd
{
    builtin cd "$1"
    : do something else
}

Ayrıca, /usr/bin/cdböyle bir komut olsa bile , çağrı asla işe yaramayacaktır.

Ne olacaktı:

  • Bash kabuğum dir /bash/dir.
  • Bir emir verdim /usr/bin/cd /dir/for/cd.
  • /usr/bin/cddir /dir/for/cd.
  • /usr/bin/cd çıkışlar.
  • Bash hala içeride /bash/dir, çünkü çocuk işlemi /usr/bin/cdebeveyni etkileyemiyor.

Ayrıca takma adlar basit metin ikameleridir. Asla parametreleri olamaz.


Ben öneririm builtin cd $@ && ls; Çünkü cdçağrı her şeyin bir anlam ifade etmesini sağlamalıdır. Ayrıca, cd(tartışma yok) gibi özel durumları hatırlayın .
Daniel Beck

Yan Not: Bunu kabul edilen cevap olarak işaretlemeye çalıştım, ancak bunu yapmadan önce 6 dakika daha beklemem gerektiğini söylüyor. Bunu yapmadan önce yerleşik bir gecikme olduğunu bilmiyordum.
Alan W. Smith

@Alan Başka, daha iyi bir çözüm çok makul bir zaman diliminde ortaya çıkabilir (yani, birkaç dakika beklemeniz gerekir). Sanırım bu nedenle sistemde zorunlu bir gecikme var: Kaliteyi hızdan çok tercih etmelisiniz. Çok fazla sıkıntı olmamalıdır.
Daniel Beck

Ve bir kazananımız var. Bu bir şampiyon gibi çalışıyor. @DanielBeck'e göre && kullanmaya başladım ve onu bir satırda yoğunlaştırdım: function cd {builtin cd "$ @" && ls -l; }
Alan W. Smith

@DanielBeck - Evet, bunun için endişelenmiyorum. Sadece daha önce farketmedim. İçindeki mantığı görebiliyorum, sadece beni biraz şaşırttı.
Alan W. Smith,

6

Cd'yi geçersiz kılmamayı öneriyorum, çünkü 'cd' işlevini kaçan başka bazı betikler de var, örneğin, rvm. Bunun yerine 'd' gibi başka bir ad seçmek ve işlevinizde 'yerleşik' türünü belirtmemek daha iyi olur; Aksi takdirde, korsanının çalışmaz. Aşağıdaki kodu kullanıyorum:

function d() { cd "$@" && ls;} 

OP'nin sorusuna göre bunun işe yaramayacağını düşündüm.
user305964
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.