ลำดับของตัวเลือกคำสั่งใน linux สำคัญหรือไม่


14

ตัวอย่างเช่นเมื่อฉันป้อน:

gcc -O hello.c -c

หรือ

gcc hello.c -c -O

ทั้งสองไม่ได้บ่น

ลำดับของตัวเลือกคำสั่งมีความสำคัญหรือไม่?

คำตอบ:


18

ขึ้นอยู่กับตัวโปรแกรมเอง ระบบปฏิบัติการไม่ได้กำหนดว่าจะสั่งหรือไม่ก็ตาม

ชุดตัวเลือกของ GCC นั้นใหญ่โตจนฉันไม่สามารถพูดกับผู้มีอำนาจใด ๆ หากคุณสามารถจัดหาตัวเลือกใด ๆตามลำดับที่กำหนดเอง คุณจะต้องอ่านเอกสารประกอบสำหรับตัวเลือกนั้น ที่กล่าวว่ากฎทั่วไปง่ายๆก็คือถ้าคุณมีตัวเลือกที่ไม่เหมือน-O1 -O2กันสองตัวเลือกขึ้นไป (เช่นสำหรับการเพิ่มประสิทธิภาพในระดับที่แตกต่างกัน) โดยทั่วไปโปรแกรมจะใช้ตัวเลือกในภายหลังมากกว่าตัวเลือกก่อนหน้า อีกครั้งนี่ไม่ได้บังคับใช้โดย linux

โปรแกรมง่ายๆที่จะช่วยให้คุณสามารถระบุตัวเลือกมากที่สุดในลำดับใด ๆ lsจะเป็น รายชื่อไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันมีรายละเอียดที่สามารถทำได้ด้วยการอย่างใดอย่างหนึ่งls -la, หรือls -al ls -l -aอย่างไรก็ตาม ls -l1 (นั่นคือ 'el' 'one') ไม่ได้ให้ผลลัพธ์เช่นเดียวกับ ls -1l ('one' 'l') เหล่านี้เป็นตัวเลือกที่ไม่เกิดร่วมกันและรายการสุดท้ายจะถูกกำหนดเป็นครั้งแรก

นอกจากนี้ยังมีโปรแกรมแปลก ๆ ที่ใช้ตัวเลือกในการโต้แย้งเมื่อพวกเขามาถึง ดังนั้นสำหรับตัวอย่างเช่นคุณอาจมีคำสั่งที่สมมุติblah -a 1 2 -b 3ที่-aนำไปใช้กับทั้งสามข้อโต้แย้ง แต่จะใช้กับ-b3

อีกครั้งนี้ขึ้นอยู่กับแต่ละโปรแกรมที่เป็นปัญหา หากคุณไม่แน่ใจให้อ่านเอกสารประกอบ


5

มีหลายกรณีที่คำสั่งของตัวเลือกบรรทัดคำสั่งมีความสำคัญแม้ใน GCC หากคุณกำลังเชื่อมโยงกับสแตติกไลบรารี (.a) ดังนั้นหากคุณระบุ-llib1 -llib2และมีฟังก์ชั่นในการliblib2.aเรียกฟังก์ชั่นในliblib1.aที่ไม่ได้นำเข้าสู่โปรแกรมลิงค์นั้นจะล้มเหลวด้วยสัญลักษณ์ที่ไม่ได้รับการแก้ไข ด้วยไลบรารีที่แบ่งใช้นี่ไม่ใช่ปัญหา

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

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

โปรดทราบว่าบน Linux (โดยเฉพาะ) GNU getopt()นั้นมีแนวโน้มที่จะจัดลำดับบรรทัดคำสั่งใหม่เพื่อให้ตัวเลือกทั้งหมด (เริ่มต้นด้วยเครื่องหมายลบ) ได้รับการประมวลผลก่อนอาร์กิวเมนต์อื่น ๆ - เว้นแต่คุณจะใช้ double-dash --เพื่อทำเครื่องหมายจุดสิ้นสุดของ อาร์กิวเมนต์หรือยกเว้นว่าคุณตั้งค่าตัวแปรสภาพแวดล้อม POSIXLY_CORRECT


4

เฉพาะในกรณีที่คุณมี 2 ตัวเลือกที่ไม่เหมือนกัน มิฉะนั้นคำสั่งจะไม่สำคัญ

แน่นอนว่าสิ่งนี้อาจแตกต่างกันไปขึ้นอยู่กับการเขียนโปรแกรม แต่ควรใช้กับเครื่องมือ * nix ปกติทั้งหมด


3

ยากที่จะรู้ว่าคนอื่นบอกคุณแล้วมันอาจสร้างความแตกต่าง (หรือไม่)

กฎง่ายๆคือการเปิดหน้าคนและดูตัวอย่างแรกและใช้คำสั่งนั้นเมื่อใส่อาร์กิวเมนต์ในนั้น

ดังนั้นถ้าเราดูคำสั่ง cat (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

ดูเหมือนว่าตราบใดที่ตัวเลือกทั้งหมดอยู่ก่อนไฟล์ที่คุณควรจะใช้ได้

และถ้าเราดูสัตว์ gcc (man gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

มันไม่ง่ายที่จะเข้าใจเหมือนคำสั่ง cat :)

แต่ถ้าคุณต้องการเล่นให้ปลอดภัย - c ดูเหมือนจะมาก่อน -O แล้ว infile (hello.c) น่าจะเป็นครั้งสุดท้าย

gcc -c -O hello.c

แต่อย่างที่คุณรู้เพราะคนอื่น ๆ ทำงาน ... นี่มันเล่นได้อย่างปลอดภัย :)


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