ฟังก์ชั่นเขียนในหนึ่งบรรทัดเป็น ~ / .bashrc


40

ทำไมเมื่อฉันพยายามเขียนฟังก์ชั่นในหนึ่งบรรทัดเป็น.bashrcไฟล์

list(){ ls -a }

ฉันได้รับข้อผิดพลาด?

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

แต่เมื่อฉันเขียนมันในหลายบรรทัดก็โอเค?

list(){
    ls -a
}

มีต่อมาคำถามเทียบเท่าเป็นกองมากเกิน
sampablokuper

คำตอบ:


33

ฟังก์ชั่นในbashชื่อคำสั่งผสมเป็นหลัก (หรือบล็อกรหัส) จาก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.

ไม่มีเหตุผลที่ให้ไว้มันเป็นเพียงไวยากรณ์

เนื่องจากรายการในฟังก์ชั่นหนึ่งบรรทัดที่กำหนดไม่ได้ถูกยกเลิกด้วยการขึ้นบรรทัดใหม่หรือ a ;, bashบ่น


42

มีความ;จำเป็นในตอนท้ายของฟังก์ชั่น:

list(){ ls -a ; }

ควรทำงาน.

ไวยากรณ์ของนิยามฟังก์ชันสำหรับ bash ถูกระบุเป็น

name () { list ; }

โปรดทราบว่ามันมีที่ไม่ได้เป็นส่วนหนึ่งของ;list

สิ่งที่;จำเป็นในสถานที่นี้คือความผิดปกติทางไวยากรณ์ มันไม่ได้เป็นbashเฉพาะมันเป็นเหมือนกันสำหรับkshแต่มันไม่จำเป็นต้องใช้ใน;zsh


18

จุดสิ้นสุดของคำสั่งเดียว (";") มีความหมายโดยขึ้นบรรทัดใหม่ ในเวอร์ชันออนไลน์}ถูกวิเคราะห์คำเป็นอาร์กิวเมนต์สำหรับls -aคำสั่งที่ไม่ได้ระบุ ซึ่งคุณสามารถดูว่าคุณทำ:

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

มาดูกันว่าคำสั่งภายในการประกาศฟังก์ชั่นกลืนวงเล็บปีกกาต่อท้ายได้อย่างไร?


2
คำอธิบายที่ดี! ดังนั้นมันจึงไม่ใช่แค่ความผิดปกติทางไวยากรณ์ จริงๆแล้วมันมีตรรกะบางอย่าง
Don Hatch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.