Tanpa itu ()
, sintaks benar-benar akan ambigu.
Harus ada beberapa sintaks yang tidak ambigu untuk mendefinisikan suatu fungsi, dan tanpa secara substansial mengubah sintaksis shell lainnya , tidak mungkin ini:
do_something {
# one or more commands go here
}
Anda mengatakan ini "tidak bertentangan dengan sintaksis saat ini," tetapi itu terjadi! Perhatikan bahwa Anda tidak mendapatkan kesalahan sintaksis apa pun ketika Anda mencoba menjalankan baris pertama itu . Anda mendapatkan kesalahan, tetapi itu bukan kesalahan tentang sintaksis. Baris kedua, dengan }
, adalah kesalahan sintaksis, tetapi baris pertama tidak. Sebagai gantinya, do_something {
upaya untuk menjalankan perintah yang dipanggil do_something
dan lulus {
sebagai argumen untuk perintah itu:
$ do_something {
do_something: command not found
Jika sudah ada perintah yang dipanggil do_something
, Anda menjalankannya. Jika sudah ada fungsi yang dipanggil do_something
, Anda memanggilnya . Sangat penting secara umum bahwa sintaks tidak ambigu, tetapi juga penting secara khusus bahwa mungkin untuk mendefinisikan kembali suatu fungsi tanpa secara tidak sengaja memanggilnya. Mendefinisikan suatu fungsi dan memanggilnya seharusnya tidak terlihat sama.
Bagaimana shell memperlakukan {
dan (
.
Seperti yang type {
akan memberitahu Anda, {
adalah kata kunci shell. Ini membuatnya seperti [[
. Jika digunakan dalam situasi di mana itu akan menjadi perintah, {
membawa semantik khusus. Secara khusus, ia melakukan pengelompokan perintah. Dalam situasi lain, bagaimanapun, ini dapat digunakan tanpa tanda untuk menunjukkan {
karakter literal . Ini termasuk situasi melewatinya sebagai kata kedua atau selanjutnya dari suatu perintah.
Tentu saja, Bash bisa dirancang untuk memperlakukan secara {
berbeda dari yang ada saat ini. Namun, sintaksnya tidak lagi kompatibel dengan shell POSIX, dan Bash tidak akan benar-benar menjadi shell bergaya Bourne dan tidak akan mampu menjalankan banyak skrip shell.
Sebaliknya, (
adalah metacharacter shell. Itu selalu diperlakukan khusus jika muncul dalam sebuah perintah dan tidak dikutip (dengan '
'
, "
"
atau \
). Dengan demikian tidak ada ambiguitas dalam sintaks:
do_something() {
# one or more commands go here
}
Itu tidak bisa berarti apa-apa lagi. Jika Bash tidak memiliki fungsi, maka itu akan menjadi kesalahan sintaksis, untuk alasan yang sama echo foo(bar)
adalah kesalahan sintaksis.
Jika Anda benar-benar tidak menyukai ()
notasi maka Anda dapat menggunakan kata kunci function
dan menghilangkannya, seperti yang disebutkan dalam sudodus . Perhatikan bahwa ini bukan bagian dari sintaks untuk mendefinisikan fungsi di sebagian besar shell gaya Bourne lainnya - dan dalam beberapa, ini didukung tetapi fungsi yang didefinisikan memiliki semantik berbeda - dan jadi skrip yang menggunakannya tidak akan portabel. (Alasan sintaks ini bisa tidak ambigu adalah karena function
itu sendiri kata kunci dalam Bash yang menandakan bahwa apa pun yang mengikutinya adalah awal dari definisi fungsi.)
Akhirnya, perhatikan bahwa sementara sebagian besar definisi fungsi digunakan {
dalam praktiknya, perintah majemuk apa pun diizinkan. Jika Anda memiliki fungsi yang tubuhnya ingin selalu Anda jalankan dalam subkulit, Anda bisa menggunakan (
)
alih-alih {
}
.