ในรูปแบบที่ง่ายที่สุดโปรแกรมจะรันคำสั่งเทอร์มินัลหรือไม่


18

พูดถึงตัวอย่างในโปรแกรมที่ให้ฉันเลือกหนึ่งโฟลเดอร์และคัดลอกไปยังตำแหน่งอื่นในระดับพื้นฐานคือแอปพลิเคชันที่รันคำสั่งที่ฉันสามารถเรียกใช้ในเทอร์มินัลหรือใช้ OS API ภายในเพื่อย้ายสิ่งนั้น

โปรดสำรองการตอบสนองที่เลวร้ายไว้กับฉัน ฉันแค่อยากรู้อยากเห็นและตระหนักโดยสิ้นเชิงว่าสามารถรับรู้ได้ว่าเป็นคำถามที่เด็กอายุ 13 ปีจะถาม


4
ยินดีต้อนรับสู่ถามที่แตกต่างกัน! คำถามบางข้อนั้นสูงกว่าคำถามอื่น ๆ และก็ไม่เป็นไร คุณไม่จำเป็นต้องขอโทษ หากคุณมีคำถามเกี่ยวกับฮาร์ดแวร์ของ Apple, ซอฟต์แวร์ Apple, ผลิตภัณฑ์หรือบริการอื่น ๆ ของ Apple, ฮาร์ดแวร์ของบุคคลที่สามและซอฟต์แวร์สำหรับผลิตภัณฑ์ของ Apple และไม่เกี่ยวกับหัวข้อที่ต้องห้ามในคำถามที่พบบ่อยแสดงว่าคุณมาถูกที่แล้ว ! ดังนั้นหากคำถามของคุณอยู่ในหัวข้อยินดีต้อนรับที่นี่แม้ว่าคุณจะอายุ 13 ปี (แต่ไม่อายุน้อยกว่าตามข้อกำหนดในการให้บริการ )
Daniel

3
คำถามที่ดี - มีคำตอบสำหรับคำถามนี้อย่างน้อยสามระดับ ฉันหวังว่านี่จะได้คำตอบพื้นฐานคำตอบตรงกลางและ "John Siracusa ตัดการทำงานภายในของโครงสร้างไบนารีของแอปพลิเคชัน Mac OS X" เพื่อให้คุณสามารถเลือกและเรียนรู้จากทั้งหมด
bmike

คำตอบ:


11

ตามหลักการแล้วมันมักจะใช้ OS API - คำถามนี้จะเป็นไปในทางใด มีสามตัวเลือกเป็นหลัก

  1. ใช้ OS API ระดับต่ำ (การเรียกระบบ) โดยตรง ในตัวอย่างของคุณงานค่อนข้างเกี่ยวข้อง: รับรายการของรายการในโฟลเดอร์ตรวจสอบชนิด (โฟลเดอร์, ไฟล์ ... ), สำหรับแต่ละรายการสร้างรายการที่สอดคล้องกันในโฟลเดอร์เป้าหมายสำหรับไฟล์อ่านเนื้อหาจาก แหล่งที่มาเขียนไปยังไฟล์เป้าหมาย ฯลฯ เนื่องจากงานมีความซับซ้อนดังนั้นจึงเป็นเรื่องง่ายที่จะได้รับสิ่งผิดปกติดังนั้นแอปพลิเคชันส่วนใหญ่จะหลีกเลี่ยงปัญหานี้

  2. ใช้ไลบรารี (API) ที่ทำให้งานง่ายขึ้น ตัวอย่างเช่นกรอบ Apple Cocoa ให้NSFileManagerคลาสด้วยcopyItemAtPath:toPath:errorวิธีที่ทำงานสกปรกทั้งหมดโดยใช้ OS API ระดับต่ำดังนั้นแอปพลิเคชันไม่จำเป็นต้องใช้ API ระดับต่ำ แต่สามารถพึ่งพาบางสิ่งที่ต้องใช้งานน้อยกว่าและมักจะอยู่เสมอ อยู่ในระบบ Apple ก็มีแนวโน้มที่จะทำให้แน่ใจว่ามันทำงานได้ดี

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

แอปพลิเคชั่นส่วนใหญ่จะใช้ตัวเลือก 2 เพราะมันง่ายกว่า 1 และปลอดภัยกว่าและมีประสิทธิภาพมากกว่า 3 เพื่อที่จะเรียกใช้กระบวนการภายนอกคุณต้องตั้งค่าอย่างถูกต้องและคุณไม่สามารถควบคุมสิ่งที่มันทำ ตัวอย่างเช่นมันยากมากที่จะคิดออกว่าอะไรผิดพลาดอย่างแน่นอนในกรณีที่มีความล้มเหลวและมันยากที่จะรู้ว่ามันกำลังทำอะไรอยู่ (เช่นแสดงความคืบหน้า) นั่นคือเหตุผลที่ในกรณีส่วนใหญ่นักพัฒนามักจะเลือกตัวเลือก 2 แต่ไม่มีการรับประกัน ตัวอย่างที่เด่นชัดคือแอพพลิเคชั่นที่ใช้เชลล์สคริปต์สำหรับการปรับแต่ง - เช่นตัวติดตั้ง

หมายเหตุผู้ใช้ขั้นสูง: คุณสามารถใช้dtraceสิ่งอำนวยความสะดวกของ OS X เพื่อค้นหาว่าแอปพลิเคชันใดกำลังทำอยู่ ตัวอย่างเช่นคุณสามารถตรวจสอบกระบวนการใด ๆ ที่กำลังวางไข่ดังนั้นคุณจะเห็นเครื่องมือที่ใช้ (ดูexecsnoop)


4

ฉันกลัวคำตอบคือ "มันขึ้นอยู่กับว่า แต่เป็นคำตอบที่สอง" ที่จริงแล้วแม้ว่าโปรแกรม GUI กำลังเรียกใช้คำสั่งเทอร์มินัลโปรแกรมก็จะรันมันโดยการเรียก API

โปรแกรมที่เป็นเพียงรายการของคำสั่งเทอร์มินัลเรียกว่าเชลล์สคริปต์ โปรแกรมดังกล่าวสามารถทำงานใน Mac OS X แต่พวกเขาต้องทำงานในหน้าต่าง Terminal หรือเรียกใช้โปรแกรมที่ใช้ GUI หากคุณต้องการดูผลลัพธ์ โปรแกรมอื่นสามารถเรียกโปรแกรมบรรทัดคำสั่งผ่าน API ภายใน

ในขณะที่คำถามการพัฒนาส่วนใหญ่อยู่นอกหัวข้อสำหรับเว็บไซต์นี้ตัวอย่างหนึ่งที่เกี่ยวกับการใช้งาน Automator

ตัวเลือกหนึ่งในรายการคำสั่งภายในที่โปรแกรมสร้างขึ้นใน Automator สามารถเรียกได้คือความสามารถในการเรียกเชลล์สคริปต์หรือรายการคำสั่งเทอร์มินัล แต่นั่นเป็นเพียงหนึ่งในตัวเลือกมากมายที่มีอยู่ภายใน API ภายใน

ป้อนคำอธิบายรูปภาพที่นี่


แต่บางครั้ง API ก็จบคำสั่งการโทรที่คุณสามารถเข้าถึงได้จาก Terminal ฉันได้อ่านรายงาน (ไม่มีอะไรที่ฉันสนใจที่จะทำซ้ำในคอมพิวเตอร์ของฉันเองขอบคุณมาก) ว่าหาก/sbin/shutdownเกิดความเสียหายหรือถูกลบคำสั่ง Shutdown ในเมนู Apple จะหยุดทำงาน
Daniel

1
เชลล์สคริปต์ไม่จำเป็นต้องรันในหน้าต่างเทอร์มินัลหรือหน้าต่างอื่น ๆ แต่หากพวกเขาผลิตผลลัพธ์ที่ไม่ได้เปลี่ยนเส้นทางไปยังไฟล์จากนั้นคุณอาจเลือกที่จะเรียกใช้ในหน้าต่าง เชลล์สคริปต์ยังสามารถเรียกใช้โปรแกรมอื่น ๆ ที่มีหน้าต่าง
ctrl-alt-delor

@richard ถูกต้องแน่นอน แก้ไข
Daniel

2

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

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

แน่นอนว่านี่คือก่อนที่อินเทอร์เฟซผู้ใช้แบบกราฟิกจะเข้ามาดังนั้น "โปรแกรม" ที่นี่คือคำสั่ง CLI ในตัวเอง

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


1

คลาสหนึ่งของโปรแกรมที่รันคำสั่งเทอร์มินัล (แม้ว่าจะเริ่มต้นด้วยการเรียก API) คือสภาพแวดล้อมการพัฒนาโปรแกรมแบบรวมเช่น eclipse หรือ Xcode คอลเลกชันของเครื่องมือที่จำเป็นสำหรับการพัฒนาโปรแกรมนั้นมีขนาดใหญ่ที่จะถูกเก็บไว้ในและการบำรุงรักษาสำหรับ IDE แต่จะสร้าง makefile (ชนิดของสคริปต์) และรันด้วย unix 'make' (หรือเทียบเท่า) เพื่อดำเนินการผ่านกระบวนการคอมไพล์ลิงก์โหลดและกระบวนการดีบั๊ก สร้างในทางกลับกันรันคอมไพเลอร์ลิงเกอร์ ฯลฯ โดยใช้อินเตอร์เฟสบรรทัดคำสั่ง สิ่งนี้ทำให้ IDE ค่อนข้างเป็นอิสระจากชุดเครื่องมือที่ถูกเลือกโดยโปรแกรมเมอร์และไม่ตอบสนองต่อการอัพเดตของเครื่องมือ


1

แอปพลิเคชันสามารถเรียกใช้คำสั่ง CLI เพื่อดำเนินงานบางอย่างและบางโปรแกรมทำได้จริง แต่เนื่องจากปัญหาด้านประสิทธิภาพผู้พัฒนาแอปพลิเคชันมืออาชีพหลีกเลี่ยงการเรียกใช้คำสั่งและใช้APIที่คำสั่งใช้เพื่อทำงานที่ต้องการ


ฉันเป็นวิศวกรซอฟต์แวร์มืออาชีพ ฉันเรียกคำสั่งจากโปรแกรมของฉัน ฉันจะเขียนบางส่วนหรือทั้งหมดด้วยตัวเองแล้วเขียนกุยในภาษาอื่น ฉันจะไม่ใช้คำสั่ง cp (copy) หรือ mv (ย้าย / เปลี่ยนชื่อ) เนื่องจาก api เพื่อคัดลอกหรือเปลี่ยนชื่อนั้นง่าย บางโครงการซอฟต์แวร์ฟรีใช้เทคนิคนี้ บางคนคาดว่าจะเขียนเครื่องมือบรรทัดคำสั่งที่ยอดเยี่ยม แต่ยากที่จะใช้ (เช่นการสร้างภาพ iso cd และการเขียนภาพลงซีดี) ผู้เชี่ยวชาญ gui เขียน gui ที่ใช้เครื่องมือทั้งสองนี้โดยทั่วไปอนุญาตให้ผู้ใช้กำหนดค่าเครื่องมือ เพื่อตั้งค่าให้พวกเขาไปและติดตามความคืบหน้า
ctrl-alt-delor

ฉันใช้APIเป็นคำง่ายๆที่คำถามใช้ ที่จริงแล้วฉันได้เขียนคำตอบซ้ำหลายครั้งในแต่ละครั้งเพื่อให้ผู้ชมที่คุ้นเคยน้อยลงด้วยการวางโค้ดและอนุสัญญาการตั้งชื่อของ API vs libs vs Frameworks ฯลฯ ฉันไม่ได้ทำผิดใด ๆ กับคุณหรืออาชีพของคุณ @richrad วิศวกรซอฟต์แวร์มืออาชีพอื่น ๆ หากมีบางสิ่งที่คุณต้องการแก้ไขในโพสต์ของฉันที่จะชี้แจงเรื่องนี้เพิ่มเติมโปรดดำเนินการต่อไป
ismail

ไม่มีความผิดฉันแค่ชี้แจง โปรแกรมเมอร์ที่ดีจะหรือไม่เรียกโปรแกรมบรรทัดคำสั่งการตัดสินใจจะขึ้นอยู่กับความซับซ้อนและอาจเป็นไปได้ (หลังจากการวัดความเร็ว) กับประสิทธิภาพ สำหรับมืออาชีพกลุ่มเล็ก ๆ ที่ขายให้กับตลาดอาจมีความจำเป็นที่จะต้องทำให้โปรแกรมของคุณซับซ้อน การเรียกโปรแกรมบรรทัดคำสั่งสามารถดูเรียบง่ายได้ ดังนั้นจึงจำเป็นต้องมีการเขียนซ้ำ หากคุณทำคอมมิชชั่นหรือซอฟต์แวร์ฟรีคุณจะทำสิ่งที่ง่ายที่สุดที่ใช้งานได้
ctrl-alt-delor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.