Bir takma ad komutuna argümanlar iletebilir miyim?


19

Takma ad komutuyla bir argüman iletip iletemeyeceğimi bilmek istiyorum.

Örneğin:

alias d="dmesg|grep -iw usb|tail -5" 

Şimdi dson 5 satırı yazdıracak. Farklı sayıda satır yazdırmak için d'yi kullanmak istersem, diğer ad komut bildiriminde dtekrar değişiklik yapmam gerekir .

Satır sayısını değiştirmek için beyanı yeniden yazmak zorunda kalmamak için bir takma ad bildirimini değiştirebileceğim herhangi bir yolu var mı? Takma ad bildirirken satır sayısını argüman olarak iletmek gibi dmi? Yoksa bunu çözmek için başka bir yöntem var mı?


(T) csh, "\! *" Bir takma ada argüman atıfta (ters eğik çizgi sadece "tarih" anlamına gelen ünlem işaretinden kaçmak için) ve hatta bağımsız değişkenlere referans bile olabilir, nasıl olduğunu hatırlamıyorum. Yani belki "kuyruk -n \! *" Ya da bir şey (sanmıyorum \! * Hemen önce eksi işareti ile çalışacaktır). Ancak, bunun (ba) sh.
barrycarter

Yanıtlar:


20

Takma adlar argüman almaz. Gibi bir takma adla alias foo='bar $1', takma ad çalıştırıldığında $1kabuk tarafından kabuğun ilk argümanına (muhtemelen hiçbir şey değildir) genişletilir.

Yani: Bunun yerine işlevleri kullanın.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} ilk bağımsız değişkeni, sağlanmadıysa varsayılan 5 değeriyle kullanır.

Sonra şunları yapabilirsiniz:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Veya biraz kullandığınız seçenekleri değiştirirseniz:

alias d="dmesg|grep -iw usb|tail -n 5"

Ardından ek -nseçenekler iletebilirsiniz :

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

İçin birden fazla -nseçenek belirtilirse tail, yalnızca son seçenek kullanılır.


İşlevsel olarak benim gibi meydan için işlevini ... yani nereye koyacağımı :) kısaca devlete yararlı olabilir ~/.bashrcya da rc.localya da her nerede?
WinEunuuchs2Unix

@ WinEunuuchs2Unix, takma adın nereye konulacağı.
muru

5

Bunun için SO'da ve burada açıklandığı gibi bir fonksiyona sahip olmanız gerekir . Takip etmeyi dene:

foo() { /path/to/command "$@" ;}

ve fooşununla ara:

foo arg1 arg2 arg3

4

Grup komutu ve here-string ile takma ad sınırlamaları üzerinde çalışma

Takma adlar argüman alamaz, ancak bunu "simüle edebilir". Örneğin, bu soruya vereceğim yanıtı örnek olarak alalım .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Burada olan önemli noktalar:

  • readbir dizeyi bir değişkene okumak için yerleşik kullanırız d. Boş karakterler (satırsonu, sekmeler, boşluklar) içeren tam bir dize okumak istediğimizden, IFS=ters eğik çizgi kaçışlarını kullanır ve devre dışı bırakırız -r.
  • <<<hangi burada-string operatörü bize karşı argüman olarak temin olursa olsun dize yönlendirmek sağlayan mkcdtakma; kullanım şöyle olurdumkcd "some directory"
  • takma içinde birden fazla komutları bir araya getirilmiş ve kullanarak geçerli kabuk yürütülür { list; }(olarak bilinen yapı group commandiçinde bashel kitabı). Önce boşluk {ve ;komutların tek tek listesinin gerekli olduğunu unutmayın.

Özel örneğinizde şunları yapabiliriz:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Ayrıca, boşlukla ayrılmış bağımsız değişkenleri depolamak için kelime ayırmayı da kullanabiliriz:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Veya birden çok argüman sağlamak için dizileri kullanabiliriz:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Fakat bu iyi bir yaklaşım mı?

Şart değil. Böyle bir yaklaşımla ilgili sorun çok spesifik olmasıdır - argümanlar kolayca alıntılanamaz, bu da sadece boşluk içermeyen argümanlarımız olabileceği anlamına gelir.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Bu elbette yaygın olarak kullanılacak bir şey değildir, çünkü gerçek dünyada karmaşık argümanlarla uğraşmak zorundayız, bu yüzden bu yaklaşım oldukça pratik değildir. Fonksiyonlar çok daha esnektir. Ve args dizesini alıntılama ihtiyacı can sıkıcı bir hale gelir.

Kısıtlamalara rağmen, bu basit dizelerle kelime bölme yapabileceğimiz argümanlar olarak çalışır, bu yüzden kısmen takma adlara argüman vermemize izin verir.

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.