Bu olmadan, ()sözdizimi gerçekten belirsiz olurdu.
Bir işlevi tanımlamak için bazı belirgin sözdizimleri olmalı ve diğer kabuk sözdizimini büyük ölçüde değiştirmeden , bu olamaz:
do_something {
# one or more commands go here
}
Bunun "şu anki sözdizimiyle çakışmadığını" söylediniz ama öyle! İlk satırını çalıştırmaya çalıştığınızda herhangi bir sözdizimi hatası almadığınızı fark edin . Bir hata alıyorsunuz, ancak sözdizimi ile ilgili bir hata değil. İkincisi, ile }, bir sözdizimi hatası, ancak ilk satır değil. Bunun yerine, do_something {denilen bir komutu çalıştırmayı dener do_somethingve {bu komutu bir argüman olarak iletir:
$ do_something {
do_something: command not found
Zaten adı verilen bir komut do_somethingvarsa, onu çalıştırıyorsunuzdur. Zaten adında bir fonksiyon varsa do_something, bunu aradığınız . Genel olarak sözdiziminin belirsiz olması önemlidir, ancak özellikle bir işlevi yanlışlıkla çağırmadan yeniden tanımlamanın mümkün olması da önemlidir. Bir fonksiyon tanımlamak ve onu çağırmak aynı görünmemelidir.
Kabuk nasıl davranır {ve (.
Gibi type {size söyleyecektir, {bir kabuk anahtar kelimedir. Bu gibi yapar [[. Aksi halde bir komut olacağı bir durumda kullanılırsa {, özel anlambilim taşır. Özellikle, komut gruplandırması gerçekleştirir. Bununla birlikte, diğer durumlarda, değişmez bir {karakteri göstermek için çıkmadan kullanılabilir . Buna, komutun ikinci veya daha sonraki bir sözcüğü olarak geçilmesi durumu da dahildir.
Tabii ki, Bash şu anda olduğundan daha farklı davranmak için dizayn edilmiş olabilir{ . Bununla birlikte, sözdizimi artık POSIX kabuğu ile uyumlu olmayacaktı ve Bash, gerçekten bir Bourne tarzı kabuk olmayacaktı ve birçok kabuk komut dosyası çalıştıramayacaktı.
Buna karşılık, (bir kabuk meta karakterdir. Her zaman bir komuta görünür ve alıntı değilse özel olarak ele (ile olan ' ', " "ya da \). Bu nedenle sözdiziminde belirsizlik yoktur:
do_something() {
# one or more commands go here
}
Bu başka bir şey ifade edemezdi. Bash'in fonksiyonları olmasaydı, sözdizimi hatası olurdu, aynı sebeple echo foo(bar)sözdizimi hatası.
Eğer ()gösterimden gerçekten hoşlanmıyorsanız, o zaman anahtar kelimeyi kullanabilir functionve sudodus'un söylediği gibi atlayabilirsiniz . Bunun, diğer Bourne tarzı mermilerin çoğunda işlevleri tanımlamak için sözdiziminin bir parçası olmadığını ve bazılarında desteklendiğini, ancak bu şekilde tanımlanmış işlevlerin farklı semantiklere sahip olduğunu ve bu nedenle onu kullanan bir komut dosyasının taşınabilir olmayacağını unutmayın. (Bu sözdiziminin net olmama nedeni function, Bash'in kendisinin, izleyenlerin bir işlev tanımının başlangıcı olduğunu gösteren bir anahtar kelime olmasıdır.)
Son olarak, çoğu fonksiyon tanımının {pratikte kullanılmasına rağmen, herhangi bir bileşik komutuna izin verildiğini unutmayın. Vücudu her zaman bir deniz kabuğu altında çalıştırmak istediğiniz bir işleve sahipseniz, ( )yerine kullanabilirsiniz { }.