Bash: Takma addaki boşluklar


116

Bash'te bir takma ad oluşturmaya çalışıyorum. Ne yapmak istiyorum haritasıdır ls -laiçinls -la | more

.Bashrc dosyamda denedim budur:

alias 'ls -la'='ls -la | more'

Ancak çalışmıyor çünkü (sanırım) takma ad adında boşluklar var. Bunun için bir iş var mı?


8
Neden olmasınalias lsm='ls -la | more'
Nifle

Yanıtlar:


125

Bash dokümantasyon devletler "Hemen hemen her amaç için, kabuk işlevleri takma adlara tercih edilmektedir." İşte argümandan oluşuyorsa (sadece) lsçıktının yerini alan ve moresonuçlanacak olan bir kabuk işlevi -la.

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

Tek astar olarak:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

Otomatik olarak boru çıkışı:

ls -la

1
if ifadesinde neden çift parantez kullanmanız gerekiyor?
altmış ayak basanları

1
@sixtyfootersdude: İki dirsekli form daha güçlü ve alışkanlıkla kullanıyorum. Mywiki.wooledge.org/BashFAQ/031
Dennis Williamson,

Peki son emir nedir? takma ad ls = 'ls ()' ??
Jeef

1
@Jeef: Hayır, cevabım takma ad yerine bir işlev kullanıyor . Daha net hale getirmek için düzenlemiştim.
Dennis Williamson,

6
@ merlinpatt: commandişlevin özyinelemeli olarak çağrılmasını önler.
Dennis Williamson,

53

Diğer ad sayfasından :

Her basit komutun ilk sözcüğü, eğer belirtilmemişse, takma adı olup olmadığını görmek için kontrol edilir. Öyleyse, bu kelime diğer adın metni ile değiştirilir. Diğer ad adı ve değiştirilen metin, diğer adın `= 'içermemesi dışında, kabuk meta karakterleri de dahil olmak üzere geçerli bir kabuk girişi içerebilir.

Bu nedenle, yalnızca ilk kelime çoklu takma takma adları imkansız kılan takma ad eşleşmeleri için denetlenir. Argümanları kontrol eden ve eşleşmeleri durumunda emrinizi çağıran ve sadece normal olanı çağıran bir kabuk betiği yazabilirsiniz ls(Bkz. @Dennis Williamson'ın cevabı )


8
+1 ls -la'yı neden takma ad olarak kullanmama izin verilmediğini açıklamak için.
altmış ayak

7
Bu yardımcı oldu çünkü onu çözmeye çalışmak yerine soruyu cevapladı. Buraya geldim çünkü içinde boşluk olan bir takma ad oluşturmak istedim ve bu olmayacak.
öfkeli 1

Bu sadece sorumu cevaplamakla kalmadı, aynı zamanda takma mekanizmasının gerçekte nasıl çalıştığı hakkında da değerli bilgiler verdi. Adam sayfasından alıntı oldukça yardımcı oldu.
Lily Finley

14

Dennis'in cevabından biraz geliştirilmiş bir yaklaşım:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

Veya bir astar:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

Bu, gerekirse, komuttan sonra daha fazla seçenek / argüman eklenmesine izin verir, örneğin ls -la -h


2
ls -latBu tedaviden dışlanmayı istersem nasıl idare eder ? -la*Girişin üstesinden gelmek için bir dava koymam gerekecek, değil mi?
Steven Lu,

-1

Bu takma adı yine de çağırabilirsiniz, ancak boşluğun komut sözcüğünün bir parçası olması için fiyat teklifi almanız gerekir. Yani seçeneği "ls -la" -p patterngeçecektir , değil .-p patternmorels

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.