Yanıtlar:
Takma adlar, kendilerine verilen tüm argümanların, takma oldukları programa argüman olarak geçirildiği komutları gibidir. Örneğin, eğer takma edildi lsiçin ls -la, daha sonra yazmaya ls foo barediyorum gerçekten yürütmek ls -la foo barkomut satırında.
Argümanların nasıl yorumlandığı üzerinde gerçek bir kontrol sahibi olmak istiyorsanız, aşağıdaki gibi bir fonksiyon yazabilirsiniz:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "$@"
}
Diğer ad çözümü
Gerçekten bir işlevi kullanmaya karşıysanız, şunları kullanabilirsiniz:
$ alias wrap_args='f(){ echo before "$@" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Sen değiştirebilirsiniz $@ile $1sadece ilk argüman istiyorum.
açıklama
Bu fargümanlardan geçen geçici bir fonksiyon yaratır .
Diğer ad argümanları yalnızca sonunda iletilir. Diğer fadın sonunda denir.
Diğer unset -fad yürütülürken işlev tanımını kaldırır, böylece daha sonra askıda kalmaz.
wrap_args x y zverir: bash: beklenmedik belirteci yakınında sözdizimi hatası `('
fTakma ad verdim . Eşsiz kaldığımda fiyi çalışıyor. Eski isim çarpışma olayı.
command type f:)
Mevcut cevaplara ek olarak, takma adların nasıl çalıştığını anlamak için önemli bir şey bir takma komuttan sonra yazdığınız tüm parametrelerin kelimenin tam anlamıyla sonunda kullanılmasıdır. Bu nedenle, diğer komutları iki komut için kullanmanın hiçbir yolu yoktur (piped veya değil), bunlardan birincisi parametreleri yorumlamalıdır. Açıklığa kavuşturmak için, işte beklendiği gibi çalışmayacak bir şeye bir örnek:
alias lsswp="ls -l | grep swp"
( bu sorudan ilham alan bir örnek ) bu, her zaman geçerli dizinde ls -lgerçekleştirilen çıktısını kullanır ve bu konuda bir grep yapar.
lsswp / tmp /
eşdeğer ls -l | grep swp /tmp/ ve olmazdı ls -l /tmp/ | grep swp .
Argümanların ortada bir yerde kullanılması gereken tüm amaçlar için, functionbunun yerine birisinin kullanılması gerekir alias.
Aslında hiçbir şey yapmak zorunda değilsin; takma adlar bunu otomatik olarak yapar. Örneğin:
$ alias less="less -eirqM"
$ less foo.txt
Foo.txt'nin ilk sayfasını lessgöreceksiniz ve EOF (-e) 'de sonlandırılacak, aramalar büyük / küçük harf duyarlı olmayacaktır (-i), vb.
Csh için cevap veriyorum:
Evet, parametreleri takma adlarda kullanabilir ve - yukarıda söylenenden farklı olarak - takma ad tanımında herhangi bir yere başvurabilirsiniz - sadece sonunda değil.
Tar-gz -ing için bir örnek:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, takma adınızı çağırırken sağlayacağınız parametreler nerede !:1ve !:2nerededir?
Kullanım örneği:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Bu, tar komutunun isteğe bağlı yerlerine yerleştirdiğiniz iki parametreyi kullandığınız anlamına gelir; tgz
shtanımlanmıştırmy_program_wrapper() { ...; }. Bash, anahtar kelimeyi ele alıyor,functionancak neden daha taşınabilir olanlarla devam etmiyor?