Tulis fungsi dalam satu baris ke ~ / .bashrc

40

Mengapa ketika saya mencoba menulis fungsi hanya dalam satu baris ke dalam .bashrcfile,

list(){ ls -a }

Saya mendapatkan kesalahan?

bash: /home/kasiya/.bashrc: line num: syntax error: unexpected end of file

tetapi ketika saya menulisnya dalam multi-baris tidak apa-apa?

list(){
    ls -a
}
αғsнιη
sumber
Ada pertanyaan setara kemudian tentang Stack Overflow .
sampablokuper

Jawaban:

33

Fungsi pada bashdasarnya adalah perintah gabungan (atau blok kode). Dari man bash:

Compound Commands
   A compound command is one of the following:
   ...
   { list; }
          list  is simply executed in the current shell environment.  list
          must be terminated with a newline or semicolon.  This  is  known
          as  a  group  command. 

...
Shell Function Definitions
   A shell function is an object that is called like a simple command  and
   executes  a  compound  command with a new set of positional parameters.
   ... [C]ommand is usually a list of commands between { and },  but
   may  be  any command listed under Compound Commands above.

Tidak ada alasan yang diberikan, itu hanya sintaks.

Karena daftar dalam fungsi satu baris yang diberikan tidak diakhiri dengan baris baru atau ;, bashkomplain.

muru
sumber
42

Ada yang ;dibutuhkan di akhir fungsi:

list(){ ls -a ; }

harus bekerja.

Sintaks definisi fungsi untuk bash ditentukan sebagai

name () { list ; }

Perhatikan bahwa itu termasuk ;yang bukan bagian dari list.

Yang ;diperlukan di tempat ini adalah semacam anomali sintaksis. Ini tidak bashspesifik, itu sama untuk ksh, tetapi ;tidak diperlukan di zsh.

Volker Siegel
sumber
18

Akhir dari satu perintah (";") tersirat oleh baris baru. Dalam versi oneline }diuraikan sebagai argumen untuk ls -aperintah yang tidak ditentukan . Yang dapat Anda lihat jika Anda melakukannya:

$ foo(){ echo "a" }
}
$ foo
a }

Lihat bagaimana perintah di dalam deklarasi fungsi menelan tanda kurung kurawal?

Joe Atzberger
sumber
2
Penjelasan hebat! Jadi ini bukan hanya anomali sintaksis; sebenarnya ada beberapa logika untuk itu.
Don Hatch