ความสับสนเกี่ยวกับการเปลี่ยนความหมายของข้อโต้แย้งและตัวเลือกมีคำจำกัดความมาตรฐานอย่างเป็นทางการหรือไม่?


11

ฉันเจอความสับสนในการทำความเข้าใจว่าตัวเลือกและข้อโต้แย้งเกี่ยวข้องกับไวยากรณ์ของคำสั่งอย่างไร

ตัวอย่างเช่นฉันพบคำจำกัดความเช่น:

  • command -a -b -c d e f

    ความแตกต่างระหว่างบางอย่าง-a -b -cเรียกพวกเขาว่าตัวเลือกหรือสวิทช์และd e fโดยการเรียกพวกเขาขัดแย้ง

  • command -a -b -c d e f

    บางตัวอย่างเช่นbashคู่มือโทร-a -b -c d e fอาร์กิวเมนต์ทั้งหมดและอธิบายว่าพวกเขาทั้งหมดสามารถเข้าถึงได้จากสคริปต์$1 $2 $3 $4 $5 $6ตามลำดับ

  • command -a b=c

    บางคนเรียก-aตัวเลือกbอาร์กิวเมนต์และcค่า แต่คนอื่น ๆ ผสมมันเหมือนในสองจุดแรกในหลากหลายรูปแบบที่เรียก-a b cอาร์กิวเมนต์ทั้งหมด

ทั้งสามรุ่นนี้เป็นเพียงตัวอย่างสำหรับสายพันธุ์ที่แตกต่างกันมากมายฉันไม่รู้ด้วยซ้ำว่าจะแสดงรายการทั้งหมดได้อย่างไร แต่ฉันสังเกตเห็นว่าไม่มีการตั้งชื่อแบบคงที่

หรืออย่างน้อยก็ไม่มีมาตรฐานการตั้งชื่อแบบมาตรฐานที่ฉันรู้เพราะฉันเจอแหล่งข้อมูลแบบสุ่มที่แตกต่างกัน แต่แม้แต่ในเว็บไซต์หรือคู่มืออย่างเป็นทางการของ Linux และ GNU ที่ฉันพบเจอก็ไม่สอดคล้องกัน

มีรูปแบบการตั้งชื่ออย่างเป็นทางการที่ฉันสามารถอ้างถึงได้ไหม?


แบบฟอร์มที่สองนั้นถูกต้อง 100% จากมุมมองของตนเอง บริบทเป็นสิ่งสำคัญมาก
Oskar Skog

คำตอบ:


18

ดัดแปลงจากส่วน "ไวยากรณ์อาร์กิวเมนต์ยูทิลิตี้" ของ POSIX มาตรฐาน :

utility_name [-a] [-b] [-c option_argument]
             [-d|-e] [-f[option_argument]] [operand...]

utility_nameยูทิลิตี้ในตัวอย่างการตั้งชื่อ มันตามมาด้วยตัวเลือก , ตัวเลือกข้อโต้แย้งและถูกดำเนินการ

อาร์กิวเมนต์ที่ประกอบด้วย-อักขระและตัวอักษรหรือตัวเลขหลักเดียวเช่นเป็นaที่รู้จักกันในชื่อตัวเลือก (หรือประวัติธง ) ตัวเลือกบางอย่างจะตามด้วยตัวเลือกการโต้แย้ง[-c option_argument]ดังแสดงด้วย ข้อโต้แย้งต่อไปนี้ตัวเลือกสุดท้ายและตัวเลือกข้อโต้แย้งที่มีชื่อถูกดำเนินการ

มาตรฐานยังกำหนด "อาร์กิวเมนต์" เป็น

ในภาษาคำสั่งเชลล์พารามิเตอร์ส่งผ่านไปยังยูทิลิตี้เป็นเทียบเท่าของสตริงเดียวในargvอาร์เรย์ที่สร้างโดยหนึ่งในexecฟังก์ชั่น อาร์กิวเมนต์เป็นหนึ่งในตัวเลือกตัวเลือกอาร์กิวเมนต์หรือตัวถูกดำเนินการตามชื่อคำสั่ง


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

"ตั้งค่าสถานะ" และ "เปลี่ยน" เป็นคำพ้องความหมายทั่วไปสำหรับ "ตัวเลือก"

ในกรณีของ

utility -a b=c
  • -aและb=cเป็นข้อโต้แย้ง
  • -aเป็นตัวเลือกหากยูทิลิตีรู้จักเช่นนี้ ( lnยูทิลิตีไม่มี-xตัวเลือกดังนั้นจึง-xไม่ใช่ตัวเลือกในการlnพูดอย่างเคร่งครัดและln -xจะกระตุ้นข้อความวินิจฉัย)
  • b=cเป็นตัวเลือกที่อาร์กิวเมนต์ถ้า-aตัวเลือกที่จะใช้เวลาโต้เถียงมิฉะนั้นมันเป็นตัวถูกดำเนินการ,
  • bและcมีไม่ได้เลือกตัวเลือกข้อโต้แย้งและไม่ได้ถูกดำเนินการในตัวเอง

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

ในการโทรหาc"ค่า" นั้น IMHO นั้นสมบูรณ์แบบ ไม่ใช่สิ่งที่ได้มาตรฐาน แต่มีน้อยคนนักที่จะเข้าใจผิดถ้าคุณพูดว่า " cเป็นคุณค่าที่มอบให้b " มันจะชัดเจนจากบริบทของโปรแกรมอรรถประโยชน์ที่เป็นปัญหา

ตัวอย่างเช่น

$ awk -v var="d" '...' data.in

ทุกคนที่รู้เกี่ยวกับการawkจะบอกว่า-v var="d"หมายถึง " ตัวแปรมีการกำหนดค่าในบรรทัดคำสั่ง "awkvard

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