มีปัญหากับเครื่องหมายขีดคั่นในฟังก์ชันนามแฝงและไฟล์เรียกทำงานหรือไม่?


25

ในการทดสอบของฉัน (ใน Bash และ Z Shell) ฉันไม่เห็นปัญหาเกี่ยวกับการกำหนดฟังก์ชั่นหรือชื่อแทนหรือสคริปต์เชลล์ปฏิบัติการที่มียัติภังค์ในชื่อ แต่ฉันไม่มั่นใจว่าสิ่งนี้จะใช้ได้ในทุกเชลล์และทุกกรณี .

เหตุผลที่ฉันต้องการทำเช่นนี้ก็คือยัติภังค์พิมพ์ได้ง่ายกว่าขีดล่างและเร็วกว่าและราบรื่นกว่า

เหตุผลหนึ่งที่ฉันลังเลที่จะเชื่อว่ามันไม่ใช่ปัญหาคือในบางภาษา (ตัวอย่างเช่นทับทิม) ยัติภังค์จะถูกตีความว่าเป็นเครื่องหมายลบแม้ไม่มีที่ว่างรอบ ๆ มันจะไม่แปลกใจเลยถ้าบางสิ่งเช่นนี้อาจเกิดขึ้นในหอยบางตัวซึ่งยัติภังค์ถูกตีความว่าเป็นการส่งสัญญาณตัวเลือกแม้ไม่มีพื้นที่

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

มีเหตุผลใดที่จะหลีกเลี่ยงยัติภังค์หรือไม่?

คำตอบ:


32

POSIX และยัติภังค์: ไม่รับประกัน

ตามมาตรฐาน POSIX ชื่อฟังก์ชั่นจะต้องเป็นชื่อที่ถูกต้องและชื่อประกอบด้วย:

3.231 ชื่อ
ในภาษาคำสั่งเชลล์คำที่ประกอบด้วยเครื่องหมายขีดล่างตัวเลขและตัวอักษรจากชุดอักขระแบบพกพาเท่านั้น อักขระตัวแรกของชื่อไม่ใช่ตัวเลข

นอกจากนี้นามแฝงจะต้องเป็นชื่อนามแฝงที่ถูกต้องซึ่งอาจประกอบด้วย:

3.10 Alias ​​Name
ในภาษาคำสั่งเชลล์คำที่ประกอบด้วยเครื่องหมายขีดล่างตัวเลขและตัวอักษรจากชุดอักขระแบบพกพาและอักขระต่อไปนี้: '!', '%', ',', '@'

การใช้งานอาจอนุญาตให้ตัวละครอื่น ๆ ภายในชื่อนามแฝงเป็นส่วนขยาย (ของฉันเน้น)

ยัติภังค์ไม่ปรากฏในบรรดาอักขระที่ต้องอนุญาตในทั้งสองกรณี ดังนั้นหากใช้งานจะไม่รับประกันการพกพา

ตัวอย่างของหอยที่ไม่สนับสนุนเครื่องหมายขีดคั่น

dashเป็นเชลล์เริ่มต้น ( /bin/sh) ในตระกูล debian-ubuntu และไม่รองรับเครื่องหมายขีดคั่นในชื่อฟังก์ชัน:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

ที่น่าสนใจก็พอจะรองรับยัติภังค์ในนามแฝงแม้ว่าตามที่ระบุไว้ข้างต้นนี่คือลักษณะการใช้งานไม่ใช่ข้อกำหนด:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

เชลล์ busybox (Almquist shell) ยังไม่สนับสนุนเครื่องหมายขีดคั่นในชื่อฟังก์ชัน:

$ a-b() { date; }
-sh: Syntax error: Bad function name

บทสรุปของยัติภังค์สนับสนุนโดยเชลล์

เป็นที่ทราบกันว่าเชลล์เหล่านี้รองรับเครื่องหมายขีดคั่นในชื่อฟังก์ชัน

  • ksh, bash, zsh

เชลล์ต่อไปนี้ทราบว่าไม่สนับสนุนเครื่องหมายขีดคั่นในชื่อฟังก์ชัน:

  • ash (busybox), csh, tcsh, dash

สรุปผลการวิจัย

  • ยัติภังค์ไม่ได้มาตรฐาน อยู่ห่างจากพวกเขาหากคุณต้องการความเข้ากันได้ข้ามเปลือก
  • ใช้ขีดล่างแทนเครื่องหมายขีดคั่น: สามารถใช้เครื่องหมายขีดล่างได้ทุกที่

2
ชื่อ-ในนั้นเป็นสิ่งชั่วร้าย ฉันจ้องมองคุณ CSS :)
PM 2Ring

ขอบคุณ ผมทดสอบในภายหลังcshและtcshและพวกเขาไม่สนับสนุนยัติภังค์ทั้ง แต่เปลือกกรได้ มันตลกเล็กน้อยที่ฉันใช้a-b()เป็นชื่อฟังก์ชั่นของฉันเช่นกัน
iconoclast

@iconoclast ฉันเพิ่มผลลัพธ์ของการทดสอบเชลล์ของคุณลงในคำตอบ ขอบคุณ
John1024

@ PM2Ring พวกเขาพิมพ์ได้ง่ายกว่าชื่อที่มีเครื่องหมายขีดล่าง หากไม่รวมประเพณีหรือการตัดสินใจใช้งานของระบบที่ไม่อนุญาตให้ใช้หลักการที่คุณสามารถชี้ไปเพื่อสนับสนุนการกล่าวอ้างว่าพวกเขาชั่วร้ายคืออะไร?
iconoclast

1
@iconoclast ชื่อที่มียัติภังค์เป็นไปไม่ได้ในหลาย ๆ ภาษาเนื่องจากยัติภังค์ถูกตีความว่าเป็นเครื่องหมายลบดังนั้นหากภาษาดังกล่าวจำเป็นต้องทำงานร่วมกันด้วยภาษาที่รองรับชื่อที่มียัติภังค์คุณจะได้รับสถานการณ์ที่ยุ่งเหยิง มีชื่ออื่นในภาษาอื่น
PM 2Ring

3

ฉันรู้ว่ามันสายเกินไป แต่บางทีคุณสามารถแก้ไขปัญหาของคุณในการทำให้การเข้าถึงขีดล่างมีมากขึ้น

xmodmap -e "keycode  20 =  underscore minus"

สิ่งนี้จะสลับขีดล่างด้วยเครื่องหมายขีดกลาง (ลบ)

ดังนั้นตอนนี้คุณต้องเลื่อนยัติภังค์สำหรับ แต่ขีดเส้นใต้ถูกพิมพ์โดยไม่มีการเลื่อน

รหัสของคุณอาจแตกต่างกันอย่างไรก็ตามฉันคิดว่ามันขึ้นอยู่กับแป้นพิมพ์ของคุณ ของฉันเกิดขึ้นที่ 20 เพียงแจ้งให้เราทราบหากคุณต้องการความช่วยเหลือในการค้นหาคีย์โค้ดที่คุณต้องการใช้

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