Otomatik olarak cd yap ls


46

Sık sık aşağıdakileri yaptığımı biliyorum:

%> cd bla/bla
%> ls

Ne zaman cdbir dizine girsem otomatik olarak bunu yapmasını istiyorum ls.

.bashrcBir süre benimle uğraştım ama nasıl gerçekleşeceğini bulamadım.

Yanıtlar:


50

Bunu bir işlevle yapabilirsiniz:

$ cdls() { cd "$@" && ls; }

&&Aracı ' cdbir dizine ve başarılı, koşmak (örn dizinin mevcut) ise ls'. Kullanılması &&operatörü daha iyi o zaman bir noktalı virgül kullanıyorsa ;olduğu gibi, iki komut arasındaki operatöre { cd "$@" ; ls; }. Bu ikinci komut ls, cdçalışıp çalışmadığına bakılmaksızın çalışacaktır . cdBaşarısız olursa, lskullanıcı için kafa karıştırıcı olan mevcut dizininizin içeriğini yazdıracaktır. En iyi uygulama olarak, kullanın &&ve kullanmayın ;.

$ cdls /var/log
CDIS.custom     fsck_hfs.log    monthly.out     system.log
$ pwd
/var/log

Genelde, özellikle yaygın olarak adlandırılan bir komut için, zaten var olan bir komutu yeniden adlandırmak kötü bir uygulamadır cd. Bunun yerine, farklı bir adla yeni bir komut oluşturun. cdAyrıca adlandırılmış bir işlev veya takma adın üzerine cdyazarsanız, 100.000 dosya içeren bir dizine girdiğinizde ne olur? Kullanan birçok yardımcı program var cdve bu sıra dışı davranıştan dolayı kafaları karışabilir. Paylaşılan bir hesap kullanıyorsanız (Örneğin root, diğer sistem yöneticileriyle çalışırken), ortamın insanların beklediğinden farklı olduğu için mevcut bir komutu değiştirmek çok tehlikeli olabilir.


Bu komut gerçekten dizini değiştirir mi? Bash'ın man sayfasından: "Değişim metninde argüman kullanmak için bir mekanizma yoktur. Argümanlar gerekirse, bir kabuk işlevi kullanılmalıdır"
enzotib

@enzotib: Evet, bu gerçekten en azından benim için dizini değiştiriyor. Çıktısını göstermek için cevabımı güncelledim pwd. Bunun en iyi uygulama olup olmadığından emin değilim, ancak genel olarak yapılır. Bkz tldp.org/LDP/abs/html/aliases.html Bazı örnekler için.
Stefan Lasiewski

2
İlk: burada çalışmıyor. İkincisi: Bu sayfada konumsal parametreleri değil değişkenleri kullanırlar. Üçüncüsü: ABS, yaygın bir kötü uygulama kaynağıdır.
enzotib

1
Takma ad, Snow Leopard'da çalışıyor, ancak CentOS5 veya CentOS6'da çalışmıyor. Yalnızca bir işlevi kullanmak için cevabımı güncelledim. Takma isim yok.
Stefan Lasiewski 10:11

1
Benim için çalışmıyor. @Frabjous cevabını denedim ve işe yarıyor: cd() { builtin cd "$@" && pwd; };- macOS'ta standart bourne kabuğu kullanarak (Sierra 10.12.6)
Döner

39

Bu benim .bashrc içinde var ve iyi çalışıyor.

function cd {
    builtin cd "$@" && ls -F
    }

.Bashrc adresimin önceki bölümlerinde var: [ -z "$PS1" ] && returnve bu satırdan sonraki her şey yalnızca etkileşimli oturumlar için geçerlidir, bu nedenle cdkomut dosyalarındaki davranışları etkilemez .


1
Tam olarak ne yapar [ -z "$PS1" ] && return?
syntagma

2
[ -z "$PS1" ]$PS(interaktif bilgi istemi değişkeni) "sıfır uzunluk" (-z) olup olmadığını kontrol eder . Eğer sıfır uzunluk ise, bu ayarlanmadığı anlamına gelir, bu yüzden Bash etkileşimli modda çalışmamalıdır. && returnParçası kaynak dan çıkar .bashrcbu koşullar altında, bu noktada.
frabjous

1
Etkileşim denetlemek için başka bir yol bakmaktır iiçinde "$-": case "$-" in *i*) ;; *) return ;; esac.
Kusalananda

@Kusalananda & frabjous: Birinin diğeri yerine kullanılması gereken durumlar var mı?
Döner

1
@Swivel PS1Değişken açılmamış veya boş olabilir ve kabuk hala etkileşimli olabilir (ancak bir uyarı olmadan). $-Emin olmak için kontrol ederim .
Kusalananda

13

konu dışı, soru etiketlendiği için / bash, ancak bazı sorular kapatıldığı için, bunun bash'tan söz etmeyen bir kopyası:

Zsh ile:

chpwd() ls

Geçerli dizin her değiştiğinde (cd, pushd, popd ...) chpwd () işlevi zsh tarafından çağrılır. tcsh benzer bir özelliğe sahiptir ve muhtemelen zsh'in nereden aldığıdır.


4

Neden .bashrc dosyanıza bir takma ad eklemiyorsunuz?

Gibi bir şey:

alias cdls='cd "$@" && ls'

@ don_crissti Bir işlev ve bir diğer ad farklı şeylerdir. Yani neden olmasın?
Jodka Limon

OP'nin istediği şeyi yapmanın en hızlı ve en temiz yolu budur. Benim düşünceme göre, fonksiyonlar daha karmaşık şeyler için kullanılmalı, sık sık yazılan komutlar için kısayollar yapılırken tam olarak takma ad için var olan şeylerdir.
Ghos3t

Bu takma adla ilgili garip bir sorun yaşıyorum, böyle kullandığımda, cdls projec2, proje 2 klasöründeki tüm dosyaları gösterecek, ancak aslında bu klasöre cd göstermeyecek, orijinal klasörde kalacaktır.
Ghos3t

2

Cd komutu için takma ad oluşturma konusundaki yaygın çözüm mükemmel değildir çünkü popd gibi mevcut dizinizi değiştirebilir veya içinde cd komutunu içeren bir komut dosyasını çalıştırabilir.

Bir komut istemini döndürmeden önce bir komutu yürüten $ PROMPT_COMMAND Bash kancasını kullanmak daha iyidir.

Komut (bizim durumumuzdaki bir işlev) ls yalnızca ekran gürültüsünü azaltmak için değiştirilmişse çalıştırılır. .Bashrc kodu:

    #each console has its own file to save PWD
    PrevDir=$(tty) 
    PrevDir=/tmp/prev-dir${PrevDir////-}
    #don't ls when shell launched
    echo $PWD > $PrevDir
    LsAfterCd() {
        [[ "$(< $PrevDir)" == "$PWD" ]] && return 0

        ll --color=always | sed 1d

        echo $PWD > $PrevDir
    }
    PROMPT_COMMAND=LsAfterCd

2

Bunu kopyala:

altercd(){ cd(){ unset -f cd ; cd $*; ls ; altercd; } } ; altercd 

Şimdi sadece basit cd yapabilirsiniz:

cd / 
(files listed)
cd /home 
(files listed)
etc... 

1

Bash'de parametre gerektiren eylem için takma adlara geçemezsiniz. Bunun için fonksiyonlar var. Öyleyse ~/.bashrcaşağıdakileri de ekleyin

mycd() {
  cd "$1"
  ls
}


Ls komutu için bir parametreye izin vermek için, mycd {builtin cd $ 1 && ls $ 2} fonksiyonunu kullanıyorum. Komutu örneğin mycd .. -la
Christian Schulzendorff

@ChristianSchulzendorff: Daha iyi tırnak kullanımı: function mycd { builtin cd "$1" && ls "$2" } .
enzotib

Çalışmıyor, sadece denedim. Dosya boştu, ancak kodunuzu ekledikten sonra hiçbir şey değişmedi.
Kara

0

Aşağıdaki kodu .profile dosyasına yerleştirin ve çalışır. HP-Unix kutusunda test edilmiştir.

cdl()
{
if [ "$#" = 0 ]; then
cd ~ && ls -ltr
elif [ -d "$@" ]; then
cd "$@" && ls -ltr
else
echo "$@" directory not found!!!
fi
}

#SET YOUR ALIAS TO CD
alias cd="cdl"

0

Daha da kullanışlı - tarihe geri dönme yeteneği ile :

function cd() {
    if [ -d "$@" ]; then
        echo -n "Stack: "
        pushd "$@"
        ls
    else
        builtin cd "$@"
    fi
}
function popd() {
    builtin popd "$@" && ls
}

Dizini değiştirdiğinizde bir satır: Stack: (current_dir) (previous_dir) ...ile gösterilecek, sonra lsçıkış. Tarih sadece bu komutu pop dirs geri dönmek için: popd.

elseYanlış bir dizine gitmeye çalışırken bir hata görmeniz için ekledim .


eğer sadece cd yaparsan - seni içinde bulunduğun son
Ian

0

lsSeçeneklerini bu şekilde etkinleştirmek iyi bir seçenek değil bence cd.

cdls() {
  cd ${$#} && ls ${@:0:$#-1}
}

Umm ... cdseçenek alıyor.
Kusalananda

0

İşte yararlı bulduğum şey (Debian 9'da):

c() {
    cd "${@}" \
    && ls --color=always -C \
    | sed '
        # on line 5, print the line,
        5 {
            # append an ellipsis
            a[...]
            # and quit
            q
        }
        # print lines 1-4 verbatim
    '
}

Bu, konsolun temiz kalması için o dizinde çok fazla öğe olması durumunda, elips ile kesilmiş çıktı verir:

$ c data/git/buildroot/package/
4th                              lua-markdown
a10disp                          lua-messagepack
acl                              lua-msgpack-native
acpica                           luaossl
acpid                            lua-periphery
[...]
$ ls -1 | wc --lines
1977

-1
alias cd='builtin cd $1 && ls -l && builtin cd $1'

Bu, diğer cevapların henüz kapsamadığı hiçbir şeyi eklemez.
jasonwryan
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.