ความแตกต่างระหว่างคำสั่งเทอร์มินัล 'dir' และ 'ls' หรือไม่


74

ฉันพยายามค้นหาความแตกต่างระหว่างการใช้dirและlsคำสั่งในเทอร์มินัล ฉันรู้ว่า ls เป็นวิธี UNIX แบบดั้งเดิมในการดูไฟล์ในไดเรกทอรีและนั่นdirคือคำสั่ง windows ที่เทียบเท่ากัน แต่พร้อมท์คำสั่งทั้งสองทำงานในเทอร์มินัล

ถ้าฉันพิมพ์dirมันจะแสดงไฟล์และโฟลเดอร์ในไดเรกทอรีและถ้าฉันพิมพ์lsมันจะเหมือนกันยกเว้นด้วยการเน้นเนื้อหา คำสั่งทั้งสองยอมรับตัวเลือก (เช่นls -aและdir -aทั้งสองส่งคืนไฟล์และโฟลเดอร์ทั้งหมดและไฟล์ที่ซ่อนอยู่

เพื่อให้ทุกคนรู้ว่าความแตกต่างคืออะไรและทำไมทั้งสองdirและlsมีการใช้งานอย่างไร


7
dir --color;)
Rinzwind

3
แค่อยากจะบอกว่าฉันประหลาดใจกับจำนวนการตอบคำถามที่ได้รับ ผมคิดว่าผมไม่ได้เป็นคนเดียวที่สงสัยเกี่ยวกับนี้ :)
BretD

3
คำสั่งจากสมัยโบราณมักจะลากเส้นที่แก่กว่าออกจากงานไม้เสมอ)
Rinzwind

คำตอบ:


70

dirและlsเป็นส่วนหนึ่งของcoreutilsและdirเกือบจะเหมือนกับlsเพิ่งมีตัวเลือกเริ่มต้นที่แตกต่างกัน

อรรถประโยชน์หลักของ GNU เป็นสาธารณูปโภคพื้นฐานของไฟล์เชลล์และการจัดการข้อความของระบบปฏิบัติการ GNU นี่คือยูทิลิตี้หลักที่คาดว่าจะมีอยู่ในทุกระบบปฏิบัติการ

info dir พูดว่า:

dirเทียบเท่ากับls -C -b; นั่นคือโดยไฟล์เริ่มต้นมีการระบุไว้ในคอลัมน์เรียงตามแนวตั้งและอักขระพิเศษจะถูกแสดงด้วยลำดับ backslash escape

โอ้และยังมีvdir! info vdirพูดว่า:

vdirเทียบเท่ากับls -l -b; นั่นคือโดยไฟล์เริ่มต้นมีการระบุไว้ในรูปแบบยาวและอักขระพิเศษจะถูกแสดงด้วยลำดับ backslash escape

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


ฉันคิดว่ามันอาจเป็นเพียงนามแฝงของอีกคนหนึ่ง ฉันคิดว่าเหตุผลคือทำให้ผู้ใช้ windows รู้สึกเหมือนอยู่บ้านมากขึ้นฮ่า ๆ ขอบคุณสำหรับคำตอบอย่างละเอียด!
BretD

4
พิมพ์alias dirเพื่อดูว่ามันคืออะไรจริง พิมพ์aliasเพื่อดูชื่อแทนทั้งหมด
user606723

2
@ user606723 'alias dir' ไม่แสดงใน 11.10 (อย่างน้อยก็ไม่ใช่สำหรับฉัน) ฉันเชื่อว่า 'นามแฝง' จะแสดงเฉพาะการตั้งค่านามแฝงของผู้ใช้ในท้องถิ่นไม่ใช่ทั่วทั้งระบบ
James

พิมพ์type dirเพื่อดูว่ามันคืออะไร (นามแฝง, คำสั่ง, ฟังก์ชั่นทุบตี ... )
ychaouche

49

ความสัมพันธ์ระหว่างlsกับdir

lsและdirเป็นโปรแกรมแยกต่างหากที่ทำงานในทำนองเดียวกัน ตามที่อธิบายและอ้างอิงด้านล่างจุดประสงค์ของdirการจัดทำคำสั่งเช่นเดียวกับlsที่เอาต์พุตไม่ได้แตกต่างกันไปขึ้นอยู่กับว่าจะไปที่เทอร์มินัลหรือไม่ เพื่อให้บรรลุถึงประโยชน์นี้dirต้องจัดรูปแบบเอาต์พุตในวิธีที่สมเหตุสมผลและมีประโยชน์ทั้งสำหรับการดูในเทอร์มินัลและสำหรับการเขียนไปยังไฟล์หรือไพพ์

มีความเข้าใจผิดที่พบบ่อยเกี่ยวกับdir:

  • หลายคนเชื่อว่าdirเป็นนามแฝงของlsแต่นั่นไม่ใช่กรณี ทั้งคำสั่งเป็นนามแฝงของคนอื่น ๆ และโดยค่าเริ่มต้นใน Ubuntu dirไม่ได้เป็นนามแฝงเลย lsและdirจัดทำโดยโปรแกรมแยกต่างหากที่ไม่เหมือนกัน
  • หลายคนเชื่อว่าdirมีเหตุผลที่คลุมเครือในอดีตหรือเพื่อให้เข้ากันได้กับมาตรฐานหรือระบบปฏิบัติการอื่น ๆ ไม่เป็นเช่นนั้น lsทำงานตามวิธีที่มันทำเพื่อความเข้ากันได้ dirซึ่งไม่จำเป็นต้องเข้ากันได้เพราะไม่ใช่คำสั่ง Unix มาตรฐานทำงานในลักษณะทางเลือกที่ผู้พัฒนาพิจารณาว่ามีคุณค่าในสิทธิของตนเองและอาจเป็นที่ต้องการมากกว่า

OK แต่ไม่ว่าวิธีการlsและdirแตกต่างกันอย่างไร

ทั้งlsและdirรายการเนื้อหาของไดเรกทอรี สองความแตกต่างที่เฉพาะเจาะจงในพฤติกรรมเริ่มต้นของพวกเขาแยกแยะพวกเขา

  1. เมื่อเอาต์พุตมาตรฐานเป็นเทอร์มินัลlsแสดงชื่อไฟล์ในคอลัมน์เรียงตามแนวตั้ง (เช่นls -C) เมื่อเอาต์พุตมาตรฐานไม่ใช่เทอร์มินัล (ตัวอย่างเช่นไฟล์หรือไพพ์ ) lsแสดงชื่อไฟล์หนึ่งรายการต่อบรรทัด (เช่นls -1)

    ไม่ว่าเอาต์พุตมาตรฐานจะเป็นเทอร์มินัลหรือไม่dirแสดงรายการชื่อไฟล์ในคอลัมน์เรียงตามแนวตั้ง (เช่นls -C)

    สำหรับทั้งสองlsและdirเริ่มต้นเหล่านี้อาจจะถูกแทนที่โดย--format=ธงและโดย-1, -C, -mและ-xธงซึ่งย่อโดยเฉพาะอย่างยิ่ง--format=ตัวเลือก ดูการจัดรูปแบบเอาต์พุตทั่วไป 10.1.4ในคู่มืออ้างอิง coreutils ของ GNUสำหรับรายละเอียด

  2. เมื่อเอาต์พุตมาตรฐานเป็นเทอร์มินัลและชื่อไฟล์ที่จะแสดงมีอักขระควบคุมให้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

คำตอบที่มีคุณภาพ แต่สามารถใช้ ToC หรือ TL; DR; :)
Kevin

5

ผมจะมีความโน้มเอียงที่จะคิดว่าdirจะมีเพียงสำหรับการทำงานร่วมกันหลัง

จากGNU Coreutils :

dir เทียบเท่ากับ ls -C -b; นั่นคือโดยไฟล์เริ่มต้นมีการระบุไว้ในคอลัมน์เรียงตามแนวตั้งและอักขระพิเศษจะถูกแสดงด้วยลำดับ backslash escape

โดยวิธีการที่lsไม่ colorize การส่งออกโดยค่าเริ่มต้น: นี้เป็นเพราะ distros ที่สุดนามแฝงlsไปในls --color=auto /etc/profile.dสำหรับการทดสอบให้พิมพ์unalias lsจากนั้นลองls: จะไม่มีสี

ที่มา: คำตอบของRenanต่อความแตกต่างระหว่าง "dir" และ "ls"คืออะไร?


แม้ว่าdirจะไม่ได้มีให้สำหรับการทำงานร่วมกันหลัง --and lsจริงคือคำตอบ --This (และคำตอบมันคำพูดจาก) ไม่ถูกต้องระบุความแตกต่างทางเทคนิคระหว่างสองคำสั่งเช่นเดียวกับการอธิบายความแตกต่าง colorization สังเกตทั่วไป ดังนั้น +1
Eliah Kagan

3

เมื่อมีข้อสงสัยให้เปรียบเทียบtype lsกับ vs type dir(ดูเพิ่มเติมที่ความแตกต่างระหว่าง ls และ la ):

$ type dir
dir is aliased to `ls -l'

$ type ls
ls is aliased to `_ls'

$ type _ls
_ls is a function
_ls ()
{
    local IFS=' ';
    command ls $LS_OPTIONS ${1+"$@"}
}
$ echo command ls $LS_OPTIONS ${1+"$@"}
command ls -N --color=tty -T 0

ความแตกต่างนั้นแตกต่างกันไปตามตัวเลือกต่าง ๆlsซึ่งในกรณีของฉัน--color=ttyจะเห็นได้ชัดเจนที่สุดระบบของคุณอาจแตกต่างกัน


2
ดูเหมือนว่านี่จะไม่ใช่การกำหนดค่าเริ่มต้นของผู้ใช้ Ubuntu เลย ฉันไม่คิดว่าระบบ Ubuntu ใด ๆ ที่ฉันเคยใช้มีlsเป็นนามแฝงสำหรับฟังก์ชั่นที่เรียกว่า_ls- แม้จะไม่ใช่บรรทัดที่มีความคิดเห็น.bashrcก็ตาม มันจะดูเหมือนเริ่มต้นสำหรับ (อย่างน้อยบางรุ่น) openSUSE แม้ว่าการตัดสินโดยการสนทนานี้ , ไฟล์นี้ (เชื่อมโยงจากที่นั่น) และ (เป็นที่ยอมรับอาจจะผิด) หน่วยความจำของฉันเมื่อฉันสุดท้ายใช้ openSUSE
Eliah Kagan

2
@EliahKagan: คุณเดาได้ว่าฉันใช้ OpenSuse! ดังนั้นอย่างที่ฉันพูดผลลัพธ์จะแตกต่างกัน แต่วิธีควรจะถูกต้องทั้งหมด
user2394284

2

คำตอบสั้น: ไม่มี dirเป็นรหัสที่มาเดียวกันกว่าls, lsไบนารีมี--colorโดยค่าเริ่มต้น (รหัสต่าง ๆ 1 บรรทัด)


7
dirคือไม่ได้lsเป็นนามแฝงของ พวกเขาจะแยกจากกันในไบนารี/usr/binประพฤติที่แตกต่างกันตามที่อธิบายในRinzwind 's คำตอบ คุณสามารถทำสิ่งนี้ได้ด้วยนามแฝง แต่นั่นไม่ใช่วิธีสำเร็จ แยกต่างหากdirและlsไบนารีปรากฏบนทุกระบบที่ใช้GNU coreutils cmp /bin/ls /bin/dirหากคุณต้องพิสูจน์ให้เรียกใช้
Eliah Kagan

2
ไม่นานมานี้มันเป็นนามแฝงและคุณสามารถเห็นมันอยู่ในรายการนามแฝงเพียงแค่พิมพ์aliasตอนนี้ไบนารีใหม่จะถูกคอมไพล์สำหรับ dir git clone git://git.sv.gnu.org/coreutilsคุณสามารถดาวน์โหลดรหัสด้วย: เพียงหนึ่งบรรทัดของรหัสที่มีการเปลี่ยนแปลงใน LS-dir.c int ls_mode = LS_MULTI_COL;และนี้คือ: ในทางเทคนิคไม่ได้เป็นนามแฝง แต่ในทางปฏิบัติมันเป็น LS แต่มีตัวเลือกเริ่มต้นที่แตกต่างกัน (รหัส 1 บรรทัด)
Francisco Valdez

1
ใช่dirเป็นlsแต่มีตัวเลือกเริ่มต้นที่แตกต่างกัน dirและlsเป็นไบนารีที่แยกจากกันในการแจกแจงที่ใช้ GNU Coreutils กระจายบางคนอาจจะหรืออาจจะมียังกำหนดนามแฝงที่เรียกว่าdir(กำหนดนามแฝงที่มีชื่อเดียวกับคำสั่งที่มีอยู่ทั่วไปสวย) แต่มันเป็นไฟล์ปฏิบัติการแยกต่างหาก ในการแยกแยะความแตกต่างระหว่างนามแฝงของเชลล์ (ซึ่งไม่ใช่ไฟล์เลย) และไฟล์สั่งการแยกต่างหากที่มีซอร์สโค้ดคล้ายกันไม่ใช่ความแตกต่างทางความคิด มันเป็นทั้งเท็จและเข้าใจผิดที่จะบอกว่าdirเป็นนามแฝงlsใน Ubuntu
Eliah Kagan

ใช่ฉันเห็นด้วยกับคุณ แต่ในกรณีนี้ไม่ใช่ซอร์สโค้ดที่คล้ายกันคือซอร์สโค้ดเดียวกัน ถ้าเราบอกว่านามแฝงเป็นเพียงสิ่งที่ระบุไว้ในaliasนั้นแน่นอนว่าไม่ใช่นามแฝง
Francisco Valdez

3
มันไม่ได้เป็นรหัสที่มาเดียวกัน ดังที่คุณกล่าวว่า "แหล่งที่มาหนึ่งบรรทัดนั้นเปลี่ยนไป" และถ้ามันเป็นแหล่งเดียวกันมันก็จะไม่เป็นนามแฝง มีหลายสิ่งในระบบ Unix ที่คล้ายกับนามแฝง แต่จะสร้างความสับสนอย่างมากกับมือใหม่ (และทำให้ผู้ใช้ที่มีประสบการณ์สูง) ต้องโทรหานามแฝง ลิงก์สัญลักษณ์ลิงก์ยากไฟล์ที่เหมือนกันไฟล์ที่คล้ายกันสคริปต์ตัวห่อหุ้มเชลล์บิวด์อินซ่อนไฟล์ปฏิบัติการและไฟล์ที่ซิงค์ (เช่นกับ UbuntuOne) ล้วนคล้ายกับนามแฝงด้วยวิธีการที่สำคัญ แต่ไม่ใช่นามแฝง
Eliah Kagan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.