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:
read
bir 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 mkcd
takma; 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 command
içinde bash
el 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.