ฉันจะอ่านซอร์สโค้ดของคำสั่งเชลล์ได้อย่างไร


158

ฉันต้องการอ่านซอร์สโค้ดที่แท้จริงซึ่งคำสั่ง linux เขียนด้วย ฉันได้รับประสบการณ์การใช้งานแล้วและตอนนี้ฉันคิดว่ามันถึงเวลาที่จะโต้ตอบกับเครื่องของฉันในระดับที่ลึกขึ้นแล้ว

ฉันได้พบคำสั่งบางอย่างที่นี่http://directory.fsf.org/wiki/GNU น่าเสียดายที่ฉันไม่สามารถค้นหาคำสั่งพื้นฐานเช่น 'ls' ซึ่งดูเหมือนจะง่ายพอที่จะเริ่มต้น

ฉันจะอ่านซอร์สโค้ดของคำสั่งเชลล์แบบง่ายๆเช่น 'ls' ได้อย่างไร ฉันทำงานบน Ubuntu 12.04


1
เยี่ยมชมตัวอย่าง: ftp.gnu.org/pub/gnu/coreutilsคุณสามารถเรียกดูรหัสออนไลน์ เปิดหนึ่งในคลังเก็บและตรวจสอบโฟลเดอร์ src
Haile

สวัสดีฉันก็พบกับสาธารณูปโภคเช่นกันมันเป็น util-linux คุณสามารถค้นหาได้ที่นี่
acgtyrant

1
lsไม่ได้เป็นส่วนหนึ่งของ Linux มันเป็นส่วนหนึ่งของ Gnu Gnu ทำงานบน Linux และเมล็ดอื่น ๆ
ctrl-alt-delor

3
ผมพบ GitHub ติดต่อง่ายขึ้นสำหรับการอ่านรหัสgithub.com/coreutils/coreutils/blob/master/src/ls.c
zyxue

คำตอบ:


168

คำสั่งพื้นฐานทั้งหมดเหล่านี้เป็นส่วนหนึ่งของcoreutilsแพ็คเกจ

คุณสามารถค้นหาข้อมูลทั้งหมดที่คุณต้องการได้ที่นี่:

http://www.gnu.org/software/coreutils/

หากคุณต้องการดาวน์โหลดแหล่งข้อมูลล่าสุดคุณควรใช้ git:

git clone git://git.sv.gnu.org/coreutils

ในการติดตั้ง git บนเครื่อง Ubuntu ของคุณคุณควรใช้ apt-get (ไม่รวม git ในการติดตั้ง Ubuntu มาตรฐาน):

sudo apt-get install git

ความจริงที่จะบอกที่นี่คุณสามารถค้นหาแหล่งที่มาเฉพาะสำหรับlsคำสั่ง:

http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c

บรรทัดรหัส 4984 เพียงคำสั่ง 'ง่ายพอ' ในขณะที่ls... คุณยังสนใจที่จะอ่านหรือไม่? โชคดี! : D


2
พระเจ้าช่วย! ฉันคิดว่ามันง่ายกว่านิดหน่อย ... เส้นทางยาวกว่าและยากกว่าที่คาดไว้ :-)
Luigi Tiburzi

21
ลองแหล่งสำหรับ catเป็นเพียง 767 บรรทัด
Drew Noakes

3
Only 4984 code lines ...- ดูเหมือนว่าใน 4 ปีและ 3 เดือนlsได้กลายเป็น 57 บรรทัดที่ซับซ้อนมากขึ้น
sherrellbc

3
ฉันจำได้เมื่อฉันพยายามเข้าใจว่าทำไมwcจึงเร็วกว่าโปรแกรม Java ที่เทียบเท่า ดังนั้นฉันจึงดูรหัส ... OMG เหมาะสำหรับการอ่านดิสก์, การบัฟเฟอร์ข้อมูล ฯลฯ หรืออะไร
ก็ตาม

@ yǝsʞǝlAฉันไม่มีความเชี่ยวชาญใน C; คุณจะบอกได้อย่างไรว่ามันมีประสิทธิภาพสูงสุดสำหรับ? คุณยกตัวอย่างให้ฉันได้ไหม
Abdul

127

ลิงค์โดยตรงไปยังแหล่งข้อมูลสำหรับบางโปรแกรมยอดนิยมในcoreutils:

  • cat (767 บรรทัด)
  • chmod (570 บรรทัด)
  • cp (2912 บรรทัด)
  • cut (831 บรรทัด)
  • date (570 บรรทัด)
  • df (1718 บรรทัด)
  • du (1112 บรรทัด)
  • echo (272 บรรทัด)
  • head (1,070 บรรทัด)
  • hostname (116 บรรทัด)
  • kill (312 บรรทัด)
  • ln (651 บรรทัด)
  • ls (4954 บรรทัด)
  • md5sum (878 บรรทัด)
  • mkdir (306 บรรทัด)
  • mv (512 บรรทัด)
  • nice (220 สาย)
  • pwd (394 บรรทัด)
  • rm (356 บรรทัด)
  • rmdir (252 บรรทัด)
  • shred (1,325 สาย)
  • tail (2301 บรรทัด)
  • tee (220 สาย)
  • touch (437 บรรทัด)
  • wc (801 บรรทัด)
  • whoami (91 สาย)

รายการทั้งหมดที่นี่


4
ขอขอบคุณที่แสดงรายการด้วยจำนวนบรรทัด :)
Gowtham Gopalakrishnan

คุณมีsu?
Aaron Esau

@ ดึงคุณมีความคิดใด ๆ ถ้ามีคำสั่งเชลล์เขียนจริงในสคริปต์เปลือก?
Rafael

6

lsเป็นส่วนหนึ่งของ coreutils คุณสามารถรับมันด้วย git:

git clone git://git.sv.gnu.org/coreutils

คุณจะพบ coreutils ที่แสดงรายการแพ็คเกจอื่น ๆ (เลื่อนไปด้านล่าง) ในหน้านี้


หรือเรียก repo ออนไลน์ ... เช่น git.savannah.gnu.org/cgit/coreutils.git/tree/src/ls.c
ไร้ประโยชน์

5

จริง ๆ แล้วมีแหล่งที่มามีสติมากกว่าเดิมโดยhttp://suckless.orgดูที่sbaseเก็บของพวกเขา:

git clone git://git.suckless.org/sbase

พวกเขามีความชัดเจนอย่างชาญฉลาดง่ายและ suckless เช่นls.cมีเพียง 369 LOC

หลังจากนั้นจะง่ายต่อการเข้าใจรหัส GNU ที่ซับซ้อนมากขึ้น


1

CoreUtils ที่อ้างถึงในโพสต์อื่น ๆ ไม่ได้แสดงการใช้งานจริงของฟังก์ชั่นส่วนใหญ่ที่ฉันคิดว่าคุณแสวงหา ในกรณีส่วนใหญ่จะให้ส่วนหน้าสำหรับฟังก์ชั่นที่เกิดขึ้นจริงที่ดึงข้อมูลซึ่งสามารถพบได้ที่นี่:

มันถูกสร้างขึ้นบนGnulibพร้อมกับซอร์สโค้ดจริงในไดเรกทอรีย่อย lib- sub


1

คุณสามารถมีไว้ใน GitHub โดยใช้คำสั่ง

git clone https://github.com/coreutils/coreutils.git

คุณสามารถค้นหารหัสที่มาทั้งหมดในโฟลเดอร์ src

คุณต้องมีคอมไพล์ติดตั้ง

สิ่งต่าง ๆ มีการเปลี่ยนแปลงตั้งแต่ปี 2012 lsซอร์สโค้ดตอนนี้มี 5309 บรรทัด


-1
    cd ~ && apt-get source coreutils && ls -d coreutils*     

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.