ฉันอยากรู้อยากเห็น - มีความแตกต่างระหว่าง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=autorm -i
ดังนั้นคำสั่งเหล่านี้ถูกออกแบบมาเพื่อให้การตั้งค่าสถานะในภายหลังแทนที่คำสั่งก่อนหน้านี้
--inplaceและ--delay-updatesตัวอย่าง) เครื่องมือบางอย่างใช้สิ่งใดก็ตามที่ผ่านมา rm -ifอาจเป็นตัวอย่างที่ดีที่นั่น แต่ไม่มีความขัดแย้งในตัวเลือก ls ของ ls ดังนั้นls -lและls -llไม่ใช่ปัญหาและไม่มีผลต่อการดำเนินการในลักษณะที่สำคัญใด ๆ คอมพิวเตอร์ทำซ้ำได้ดี