ฉันอยากรู้อยากเห็น - มีความแตกต่างระหว่างls -l
และls -lllllllllllllllllllllllllllll
?
ผลลัพธ์ดูเหมือนจะเหมือนกันและฉันสับสนว่าทำไมจึงls
อนุญาตให้สวิตช์ซ้ำกัน นี่เป็นมาตรฐานการปฏิบัติระหว่างคำสั่งส่วนใหญ่หรือไม่?
ฉันอยากรู้อยากเห็น - มีความแตกต่างระหว่างls -l
และls -lllllllllllllllllllllllllllll
?
ผลลัพธ์ดูเหมือนจะเหมือนกันและฉันสับสนว่าทำไมจึงls
อนุญาตให้สวิตช์ซ้ำกัน นี่เป็นมาตรฐานการปฏิบัติระหว่างคำสั่งส่วนใหญ่หรือไม่?
คำตอบ:
คำตอบสั้น ๆ :
เพราะมันถูกโปรแกรมให้ละเว้นการใช้งานหลายอย่างของการตั้งค่าสถานะ
คำตอบยาว:
ที่คุณสามารถดูในรหัสที่มาของการls
มีส่วนร่วมกับฟังก์ชั่นgetopt_long()
และกรณีที่สวิทช์ขนาดใหญ่:
1648 int c = getopt_long (argc, argv,
1649 "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650 long_options, &oi);
....
1654 switch (c)
1655 {
....
1707 case 'l':
1708 format = long_format;
1709 break;
....
1964 }
ฟังก์ชั่นgetopt_long()
อ่านพารามิเตอร์ทั้งหมดที่กำหนดให้กับโปรแกรม ในกรณี-l
ที่ตัวแปรformat
ถูกตั้งค่า ดังนั้นเมื่อคุณพิมพ์หลาย-lllllllll
ตัวแปรนั้นถูกตั้งค่าไว้หลายครั้ง แต่มันไม่เปลี่ยนแปลงอะไรเลย
มันเปลี่ยนสิ่งหนึ่ง คำสั่ง switch case ขนาดใหญ่นี้ต้องรันหลายครั้งเนื่องจากมีหลาย-l
แฟล็ก ls
ต้องการอีกต่อไปเพื่อให้เสร็จสมบูรณ์ด้วย-l
ธงหลายรายการ แต่คราวนี้ไม่น่าพูดถึง =)
เพราะมันเป็นสิ่งที่ถูกต้องที่จะทำ สมมติว่าคุณมีสคริปต์ที่ทำสิ่งที่ชอบ:
ls $LS_OPTIONS -l "$dir"
ที่มันเป็นไปได้ที่มีอยู่แล้ว$LS_OPTIONS
-l
มันจะตอบโต้ได้ง่ายและน่ารำคาญสำหรับคำสั่งนี้เพื่อสร้างข้อผิดพลาดและจะต้องใช้ตรรกะเพิ่มเติมในสคริปต์เพื่อหลีกเลี่ยงมัน
-l
อาจไม่ใช่ตัวอย่างที่ดีที่สุดสำหรับสิ่งนี้ แต่หวังว่าคุณจะเห็นว่าแนวคิดนี้มีผลอย่างไร ตัวอย่างที่ดีกว่าคือตัวเลือกคอมไพเลอร์$CFLAGS
ซึ่งอาจทำซ้ำตัวเลือกที่ชัดเจนในการเรียกใช้คอมไพเลอร์โดยเฉพาะ
ls
ด้วยตัวเลือกบางชุด
-l
ในของคุณls
นามแฝงดูเหมือนความคิดที่ไม่ดีปัญหาเดียวกันมีแนวโน้มที่จะเกิดขึ้นกับตัวเลือกที่มีความสุขในการโต้ตอบls
นามแฝงเหมือนหรือ-p
--color=auto
ls
นามแฝงไม่ได้จะเรียกว่า ll
อาจจะเป็นนามแฝงสำหรับและในระบบที่มีนามแฝงว่าผมอาจจะพิมพ์ls -l
ll -lart
ls
ไม่ได้เป็นbash
คำสั่ง bash
แต่ปฏิบัติการที่แยกต่างหากที่คุณจะเกิดขึ้นจากการเปิดตัว ที่กล่าวว่า-l
เป็นเพียงประเภทของธงบูลีนซึ่งหากปัจจุบันทำให้เกิดls
การใช้รูปแบบยาวสำหรับการส่งออก โปรแกรมส่วนใหญ่จะเพิกเฉยต่อการใช้งานหลายครั้ง ( ls -ll
เหมือนกันls -l -l
) ของแฟล็กดังกล่าวแม้ว่าจะมีข้อยกเว้นบางอย่าง (ตัวอย่างเช่นถ้า-v
หมายถึง 'verbose' จากนั้นโปรแกรมอาจตีความการใช้งานหลายครั้งเพื่อแปลว่า
-vvv
ssh
aptitude moo
ชื่อแทนของเชลล์จะค่อนข้างน่ารำคาญหากคำสั่งเช่นls
นั้นไม่อนุญาตให้ใช้ตัวเลือกซ้ำ ๆ
สมมติว่าคุณมี
alias ls='ls --color=auto'
alias rm='rm -i'
แล้วถ้าธงที่ขัดแย้งกันไม่ได้รับอนุญาตก็จะเกิดข้อผิดพลาดในการออกคำสั่งเช่นls --color=never
หรือหรือls --color=auto
rm -i
ดังนั้นคำสั่งเหล่านี้ถูกออกแบบมาเพื่อให้การตั้งค่าสถานะในภายหลังแทนที่คำสั่งก่อนหน้านี้
--inplace
และ--delay-updates
ตัวอย่าง) เครื่องมือบางอย่างใช้สิ่งใดก็ตามที่ผ่านมา rm -if
อาจเป็นตัวอย่างที่ดีที่นั่น แต่ไม่มีความขัดแย้งในตัวเลือก ls ของ ls ดังนั้นls -l
และls -ll
ไม่ใช่ปัญหาและไม่มีผลต่อการดำเนินการในลักษณะที่สำคัญใด ๆ คอมพิวเตอร์ทำซ้ำได้ดี