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 ls
için ls -la
, daha sonra yazmaya ls foo bar
ediyorum gerçekten yürütmek ls -la foo bar
komut 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 $1
sadece ilk argüman istiyorum.
açıklama
Bu f
argümanlardan geçen geçici bir fonksiyon yaratır .
Diğer ad argümanları yalnızca sonunda iletilir. Diğer f
adın sonunda denir.
Diğer unset -f
ad yürütülürken işlev tanımını kaldırır, böylece daha sonra askıda kalmaz.
wrap_args x y z
verir: bash: beklenmedik belirteci yakınında sözdizimi hatası `('
f
Takma ad verdim . Eşsiz kaldığımda f
iyi ç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 -l
gerç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, function
bunun 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ı less
gö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 !:1
ve !:2
nerededir?
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
sh
tanımlanmıştırmy_program_wrapper() { ...; }
. Bash, anahtar kelimeyi ele alıyor,function
ancak neden daha taşınabilir olanlarla devam etmiyor?