Viết hàm trong một dòng vào ~ / .bashrc


40

Tại sao khi tôi cố gắng viết một hàm chỉ trong một dòng vào .bashrctệp,

list(){ ls -a }

Tôi bị lỗi?

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

Nhưng khi tôi viết nó trong nhiều dòng thì có ổn không?

list(){
    ls -a
}

Có một câu hỏi tương đương sau đó về Stack Overflow .
sampablokuper

Câu trả lời:


33

Các hàm trong bashcơ bản được đặt tên các lệnh ghép (hoặc khối mã). Từ 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.

Không có lý do nào được đưa ra, đó chỉ là cú pháp.

Vì danh sách trong hàm một dòng được cung cấp không bị chấm dứt với dòng mới hoặc a ;, nên bashphàn nàn.


42

Có một ;cần thiết ở cuối chức năng:

list(){ ls -a ; }

nên làm việc.

Cú pháp của một định nghĩa hàm cho bash được chỉ định là

name () { list ; }

Lưu ý rằng nó bao gồm một ;cái không phải là một phần của list.

Rằng ;yêu cầu ở nơi này là một loại dị thường cú pháp. Nó không bashcụ thể, nó giống nhau cho ksh, nhưng nó ;không bắt buộc zsh.


18

Kết thúc của một lệnh đơn (";") được ngụ ý bởi dòng mới. Trong phiên bản trực tuyến }được phân tích cú pháp như là một đối số cho ls -alệnh unterminated . Mà bạn có thể thấy nếu bạn làm:

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

Xem cách lệnh bên trong khai báo hàm nuốt dấu ngoặc nhọn?


2
Giải thích tuyệt vời! Vì vậy, nó không chỉ là một cú pháp bất thường; thực sự có một số logic với nó.
Don nở
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.