Fungsi didefinisikan sebagai:
do_something () {
do it
}
Saya bisa memahami namanya 'do_something' dan kurung kurawal untuk merangkum kode tindakan, tetapi saya tidak bisa mendapatkan ide apa tujuan di ()
sini, karena tidak ada parameter bernama dalam skrip Bash. Mungkin lebih baik dan mudah untuk mendefinisikannya sebagai
do_something {
do it
}
Yang tidak bertentangan dengan sintaksis saat ini, dan bahkan lebih menyatakan bahwa tidak ada parameter bernama. Apa gunanya di ()
sini?
Jawaban:
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:
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 dipanggildo_something
dan lulus{
sebagai argumen untuk perintah itu:Jika sudah ada perintah yang dipanggil
do_something
, Anda menjalankannya. Jika sudah ada fungsi yang dipanggildo_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: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 kuncifunction
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 karenafunction
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{
}
.sumber
The
()
token untuk memberitahu shell interpreter bahwa Anda menyatakan fungsi.Alternatif dalam
bash
adalahfunction
atau sebagai one-liner, Anda dapat menguji
sumber
function
kunci adalah ksh-isme pra-POSIX yang didukung bash untuk kompatibilitas mundur; Namun, bash mendukungnya dengan buruk (tidak menjadikan variabel sebagai default-lokal fungsi, seperti yang dilakukan ksh lama pada fungsi yang dideklarasikan dalam formulir itu). Akibatnya, itu tidak ideal untuk kode baru. Lihat wiki.bash-hackers.org/scripting/obsoletetypeset
tanpa-g
fungsi selalu mendeklarasikan variabel lokal. Denganfunction
variabel lingkup kata kunci, bash, dan ksh dengan cara yang sama , bukan?Betapa sangat benar-benar-kuat-gaya- diri Anda!
Pertimbangkan gaya penahan lain yang sangat bagus:
Bagaimana shell dapat mengatakan bahwa itu adalah definisi fungsi dan bukan hanya perintah yang
foo
diikuti oleh daftar perintah? Dalam semua kasus ini, faktor disambiguasi tambahan, seperti()
ataufunction
kata kunci diperlukan.sumber
()
atau sesuatu seperti itu.