ความสัมพันธ์ระหว่าง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.h
ls.c
เป็นdir
ประโยชน์จริงๆ?
หากคุณเคยอยากls
เอาท์พุทหลายคอลัมน์แม้เมื่อคุณประปามันless
( ls | less
) หรือเปลี่ยนเส้นทางไปยังไฟล์ ( ls > out.txt
), คุณสามารถใช้หรือdir
ls -C
หากคุณเคยคิดว่าคุณสามารถโดยตรงคัดลอกชื่อไฟล์ที่แสดงโดยls
และใช้เป็นส่วนหนึ่งของคำสั่งโดยไม่ต้องกังวลเกี่ยวกับข้อความที่คุณสามารถใช้หรือdir
ls -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=auto
dir
dir --color
;)