ความสัมพันธ์ระหว่างlsกับdir
lsและdirเป็นโปรแกรมแยกต่างหากที่ทำงานในทำนองเดียวกัน ตามที่อธิบายและอ้างอิงด้านล่างจุดประสงค์ของdirการจัดทำคำสั่งเช่นเดียวกับlsที่เอาต์พุตไม่ได้แตกต่างกันไปขึ้นอยู่กับว่าจะไปที่เทอร์มินัลหรือไม่ เพื่อให้บรรลุถึงประโยชน์นี้dirต้องจัดรูปแบบเอาต์พุตในวิธีที่สมเหตุสมผลและมีประโยชน์ทั้งสำหรับการดูในเทอร์มินัลและสำหรับการเขียนไปยังไฟล์หรือไพพ์
มีความเข้าใจผิดที่พบบ่อยเกี่ยวกับdir:
- หลายคนเชื่อว่า
dirเป็นนามแฝงของlsแต่นั่นไม่ใช่กรณี ทั้งคำสั่งเป็นนามแฝงของคนอื่น ๆ และโดยค่าเริ่มต้นใน Ubuntu dirไม่ได้เป็นนามแฝงเลย lsและdirจัดทำโดยโปรแกรมแยกต่างหากที่ไม่เหมือนกัน
- หลายคนเชื่อว่า
dirมีเหตุผลที่คลุมเครือในอดีตหรือเพื่อให้เข้ากันได้กับมาตรฐานหรือระบบปฏิบัติการอื่น ๆ ไม่เป็นเช่นนั้น lsทำงานตามวิธีที่มันทำเพื่อความเข้ากันได้ dirซึ่งไม่จำเป็นต้องเข้ากันได้เพราะไม่ใช่คำสั่ง Unix มาตรฐานทำงานในลักษณะทางเลือกที่ผู้พัฒนาพิจารณาว่ามีคุณค่าในสิทธิของตนเองและอาจเป็นที่ต้องการมากกว่า
OK แต่ไม่ว่าวิธีการlsและdirแตกต่างกันอย่างไร
ทั้งlsและdirรายการเนื้อหาของไดเรกทอรี สองความแตกต่างที่เฉพาะเจาะจงในพฤติกรรมเริ่มต้นของพวกเขาแยกแยะพวกเขา
เมื่อเอาต์พุตมาตรฐานเป็นเทอร์มินัลlsแสดงชื่อไฟล์ในคอลัมน์เรียงตามแนวตั้ง (เช่นls -C) เมื่อเอาต์พุตมาตรฐานไม่ใช่เทอร์มินัล (ตัวอย่างเช่นไฟล์หรือไพพ์ ) lsแสดงชื่อไฟล์หนึ่งรายการต่อบรรทัด (เช่นls -1)
ไม่ว่าเอาต์พุตมาตรฐานจะเป็นเทอร์มินัลหรือไม่dirแสดงรายการชื่อไฟล์ในคอลัมน์เรียงตามแนวตั้ง (เช่นls -C)
สำหรับทั้งสองlsและdirเริ่มต้นเหล่านี้อาจจะถูกแทนที่โดย--format=ธงและโดย-1, -C, -mและ-xธงซึ่งย่อโดยเฉพาะอย่างยิ่ง--format=ตัวเลือก ดูการจัดรูปแบบเอาต์พุตทั่วไป 10.1.4ในคู่มืออ้างอิง coreutils ของ GNUสำหรับรายละเอียด
เมื่อเอาต์พุตมาตรฐานเป็นเทอร์มินัลและชื่อไฟล์ที่จะแสดงมีอักขระควบคุมให้lsพิมพ์?แทนอักขระควบคุมแต่ละตัว (เช่นls -q) เมื่อเอาต์พุตมาตรฐานไม่ใช่เทอร์มินัลlsพิมพ์อักขระควบคุมตามที่เป็น (เช่นls --show-control-chars)
ไม่ว่าเอาต์พุตมาตรฐานจะเป็นเทอร์มินัลหรือไม่เมื่อdirพบกับอักขระควบคุมหรืออักขระอื่นใดที่จะถูกตีความเป็นพิเศษหากเข้าสู่เชลล์มันจะพิมพ์ลำดับแบ็กสแลชสำหรับอักขระ ซึ่งรวมถึงอักขระที่ค่อนข้างธรรมดาเช่นช่องว่าง ยกตัวอย่างเช่นdirจะแสดงรายการที่เรียกว่าเป็นDocuments backups Documents\ backupsเป็นเช่นls -bนี้
สำหรับทั้งสองlsและdirเริ่มต้นเหล่านี้อาจถูกแทนที่โดยธงที่ระบุไว้ใน10.1.7 การจัดรูปแบบชื่อแฟ้มในcoreutils GNU อ้างอิงคู่มือ ซึ่งรวมถึง-b, -q, --quoting-style=และบางคนอื่น ๆ
แหล่งที่มา : การภาวนา LSและภาวนา dirในcoreutils GNU อ้างอิงคู่มือ
มีทำไมdir?
เหตุผลสำหรับการแยกdirยูทิลิตี้จะได้รับใน4.5 มาตรฐานการเชื่อมต่อโดยทั่วไปของมาตรฐานการเข้ารหัส GNU ฉันขอแนะนำให้อ่านในส่วนนั้นทั้งหมดเพื่อทำความเข้าใจเหตุผลของนักพัฒนา แต่นี่เป็นไฮไลท์ที่เกี่ยวข้องกับls/ dir:
กรุณาอย่าทำให้พฤติกรรมของยูทิลิตี้ขึ้นอยู่กับชื่อที่ใช้ในการเรียกมัน....
ให้ใช้ตัวเลือกรันไทม์หรือสวิตช์รวบรวมหรือทั้งสองอย่างเพื่อเลือกระหว่างพฤติกรรมทางเลือกแทน...
ในทำนองเดียวกันโปรดอย่าทำให้พฤติกรรมของโปรแกรมบรรทัดคำสั่งขึ้นอยู่กับประเภทของอุปกรณ์ส่งออก....
ความเข้ากันได้ต้องการโปรแกรมบางอย่างที่จะขึ้นอยู่กับประเภทของอุปกรณ์ส่งออก มันจะเป็นหายนะหากlsหรือshไม่ทำตามที่ผู้ใช้ทุกคนคาดหวัง ในบางกรณีเราเสริมโปรแกรมด้วยรุ่นสำรองที่ต้องการซึ่งไม่ได้ขึ้นอยู่กับประเภทของอุปกรณ์ส่งออก ตัวอย่างเช่นเราจัดให้มีdirโปรแกรมที่คล้ายกันมาก
lsยกเว้นว่ารูปแบบเอาต์พุตเริ่มต้นของมันจะเป็นรูปแบบหลายคอลัมน์เสมอ
โครงการ GNU พิจารณาว่าไม่พึงประสงค์จากมุมมองทางเทคนิคสำหรับยูทิลิตี้ในการผลิตเอาต์พุตที่แตกต่างกันขึ้นอยู่กับชนิดของอุปกรณ์ที่กำลังเขียนไปยัง (อย่างน้อยในการกำหนดค่าเริ่มต้นของยูทิลิตี้) สำหรับยูทิลิตี้บางอย่างรวมถึงlsเอาท์พุทขึ้นอยู่กับอุปกรณ์เป็นสิ่งจำเป็นสำหรับความเข้ากันได้และทำงานตามที่ผู้ใช้คาดหวัง ผู้ใช้บางรายชอบพฤติกรรมที่ขึ้นอยู่กับอุปกรณ์นี้เป็นพิเศษ
ในขณะที่lsไม่สามารถเขียนให้อุปกรณ์ทำงานได้อย่างมีเหตุผล แต่dirยูทิลิตี้แยกต่างหากถูกสร้างขึ้นเพื่อให้ได้สิ่งนี้ ดังนั้นจึงdirไม่ได้เป็นยูทิลิตี้ที่พฤติกรรมแปลกสำหรับเหตุผลของ compatibility-- ประวัติศาสตร์คือls
เพื่อดูว่าls, dirและที่เกี่ยวข้องกับvdirสาธารณูปโภคจะดำเนินการในรหัส coreutils แหล่งที่มาโดยไม่ต้องทำสำเนารหัสจำเป็นดูls-dir.c, ls-ls.c, ls-vdir.c, และls.hls.c
เป็นdirประโยชน์จริงๆ?
หากคุณเคยอยากlsเอาท์พุทหลายคอลัมน์แม้เมื่อคุณประปามันless( ls | less) หรือเปลี่ยนเส้นทางไปยังไฟล์ ( ls > out.txt), คุณสามารถใช้หรือdirls -C
หากคุณเคยคิดว่าคุณสามารถโดยตรงคัดลอกชื่อไฟล์ที่แสดงโดยlsและใช้เป็นส่วนหนึ่งของคำสั่งโดยไม่ต้องกังวลเกี่ยวกับข้อความที่คุณสามารถใช้หรือdirls -b
dirเทียบเท่ากับดังนั้นในแง่ที่ว่าคุณไม่จำเป็นต้องls -Cb dirแต่dirมีการผสมผสานของตัวเลือกต่าง ๆ ที่ในทางปฏิบัติมักจะมีประโยชน์
ทำไมฉันถึงได้รับ colorized output จากls(แม้ls -Cb) แต่ไม่ใช่dir!
ส่วนใหญ่ผู้ใช้อูบุนตูได้นามแฝงเรียกว่าซึ่งไหลls ls --color=autoเมื่อlsมีอยู่ทั้งในนามแฝงและคำสั่งภายนอกนามแฝงจะมีความสำคัญกว่าในคำสั่งแบบโต้ตอบที่เรียบง่าย
คำจำกัดความนามแฝงไม่ได้ขยายซ้ำ - มันภายนอกlsคำสั่งว่านามแฝงที่โทรด้วยls --color=autoดู6.6 นามแฝงในคู่มืออ้างอิง Bashสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของชื่อแทน
เมื่อผ่านไปls, dirหรือvdir(และบางคำสั่งอื่น ๆ เช่นgrep) --color=autoใช้สีเมื่อเอาท์พุทเป็นขั้ว แต่ไม่เป็นอย่างอื่น
ตามค่าเริ่มต้นใน Ubuntu บัญชีผู้ใช้จะถูกสร้างขึ้นด้วยสิ่งนี้ใน~/.bashrc:
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
คุณจะสังเกตเห็นว่าlsนามแฝง ( alias ls='ls --color=auto') ไม่ใส่เครื่องหมายข้อคิดเห็นขณะที่สำหรับdirและvdirมีการแสดงความคิดเห็นด้วย#ดังนั้นจึงไม่มีผล นั่นคือในขณะที่dirไม่ได้เป็นนามแฝงlsถูก ( แต่ไม่dir )
ฉันจะdirสร้างผลผลิตสีได้อย่างไร
หากต้องการเปิดใช้งานเอาต์พุตสีด้วยdirเพียงแค่แก้ไข.bashrcในโฮมไดเร็กตอรี่ของคุณและยกเลิกการใส่เครื่องหมาย#alias dir='dir --color=auto'บรรทัดโดยการลบส่วนนำ#ออก ในกระสุนที่เริ่มต้นหลังจากการเปลี่ยนแปลงdirจะเป็นนามแฝง
หากคุณต้องการเปลี่ยนแปลงในเปลือกปัจจุบันคุณสามารถเรียกใช้คำนิยามนามแฝงเป็นคำสั่งหรือคุณสามารถมาด้วยการวิ่ง.bashrc. ~/.bashrc
สิ่งนี้จะไปกับจุดหลักของ - dirว่ามันควรจะผลิตผลลัพธ์ประเภทเดียวกันโดยไม่คำนึงถึงอุปกรณ์ส่งออก อย่างไรก็ตาม:
- หากคุณพบว่ามีประโยชน์ในการสร้าง
dirชื่อแทนนี้คุณควรทำเช่นนั้นอย่างแน่นอน
- เมื่อเรียกว่าเป็นคำสั่งภายนอกเช่นในสคริปต์หรือถ้าคุณแทนที่นามแฝงโดยการเรียกใช้
\dirหรือcommand dir, dirจะยังคงผลิตออกอุปกรณ์อิสระ นี้คือการพูด aliasing ที่dirจะไม่ทำลายจริงๆdir --color=autodir
dir --color;)