ชื่อฟังก์ชันสคริปต์ Bash ที่มีเครื่องหมายโคลอนคู่ '::'


17

ฉันมาข้ามสคริปต์ทุบตีในวันนี้ว่ามีฟังก์ชั่นที่มีชื่อทวิภาคคู่::ในพวกเขาเช่นและfile::write() file::read()ฉันไม่เคยเห็นไวยากรณ์นี้มาก่อนในสคริปต์ Bash และเมื่อฉันเรียกใช้สคริปต์สคริปต์จะทำงานได้ดี (ทำให้ฉันประหลาดใจ)

หลังจากกำจัด man page ของ Bash ในระบบของฉัน (และออนไลน์) ฉันไม่พบสิ่งใดในเอกสารที่สนับสนุนไวยากรณ์นี้สำหรับชื่อฟังก์ชัน ตัวอย่างเช่นส่วนShell Defined Functionsกำหนดไวยากรณ์สำหรับฟังก์ชั่นเปลือกที่จะ

function name [()] compound-command [redirection]

และจากนั้น (ที่อื่น ๆ ในคู่มือ) โทเค็นnameถูกกำหนดเป็น

name   A word consisting only of alphanumeric characters and
       underscores, and beginning with an alphabetic character
       or an underscore.  Also referred to as an identifier.

ไม่มีการเอ่ยถึงไวยากรณ์ของโคลอนคู่สำหรับชื่อฟังก์ชัน

เพียงอ้างอิงอื่น ๆ เพื่อไวยากรณ์ลำไส้ใหญ่นี้สองครั้งที่ฉันได้พบป่านนี้อยู่ในนี้คู่มือสไตล์เชลล์ (ดูหมวดNaming Conventions > Function Names) ซึ่งแนะนำให้ใช้ไวยากรณ์ลำไส้ใหญ่คู่สำหรับฟังก์ชั่นในชื่อ "แพคเกจ" - mypackage::myfunction()เช่น

ไวยากรณ์สองโคลอนนี้สำหรับชื่อฟังก์ชั่นเป็นคุณสมบัติที่ถูกต้องของเปลือก Bash หรืออาจเป็นคุณลักษณะที่ไม่มีเอกสารหรือ หากเป็นแบบถูกต้องจะมีการจัดทำเอกสารไว้ในคู่มือ Bash ที่ไหน ฉันดูแล้วก็มอง แต่ฉันไม่พบอะไรเกี่ยวกับมันในคู่มือ สิ่งที่ฉันพบที่ใกล้เคียงที่สุดคือการใช้::ในPATHตัวแปรสภาพแวดล้อมเพื่อเพิ่มไดเรกทอรีการทำงานปัจจุบันไปยังเส้นทางการค้นหา

ตัวอย่าง

#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def

ฉันทดสอบสคริปต์นี้ใน Linux distros ที่แตกต่างกันสามแบบและสคริปต์ทั้งสามabc::defจะพิมพ์ไปที่ stdout


อนุญาตให้ใช้ - stackoverflow.com/questions/44558080/…
slm

หนึ่งอาจเห็น%%ในชื่อฟังก์ชันunix.stackexchange.com/questions/401166/…
michael

ขอบคุณสำหรับลิงค์ แปลก ก่อนที่จะโพสต์ฉันค้นหา "bash double colon" (ไม่มีเครื่องหมายคำพูด) แต่ไม่พบอะไรเลย ขออภัยในการถามคำถามที่ตอบแล้ว .
Jim Fischer

คำตอบ:


16

นี่เป็นกรณีของเอกสารที่เข้มงวดกว่าการนำไปใช้อาจเป็นไปได้ในความพยายามที่จะลดปัจจัยปืน เรื่องนี้เคยพูดถึงที่นี่มาก่อน ; ดูเพิ่มเติมที่การทดสอบแบบละเอียดซึ่งการสร้างนั้น[}{เป็นชื่อฟังก์ชันที่ถูกต้อง

นอกจากนี้ยังอาจเป็นเรื่องน่าสังเกตว่าabc::defไม่ใช่ชื่อตัวแปรที่ถูกต้อง:

$ abc::def=foo
bash: abc::def=foo: command not found

4
เพียงเพื่อให้ชัดเจนแจ่มใส - ไม่ใช่ file::readหรือ[}{เป็นตำแหน่งที่ถูกต้อง
Steven Penny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.