Ở dạng đơn giản nhất, các chương trình chỉ chạy các lệnh đầu cuối?


18

Ví dụ, trong một chương trình, nó cho phép tôi chọn một thư mục và sao chép nó sang một vị trí khác, ở mức độ rất cơ bản là ứng dụng đó chạy các lệnh mà tôi có thể chạy trong thiết bị đầu cuối hoặc nó có sử dụng một số API hệ điều hành nội bộ để thực hiện việc đó không?

Xin vui lòng cho tôi bất kỳ phản ứng xấu xa; Tôi chỉ tò mò và hoàn toàn nhận thức được nó có thể được coi là một câu hỏi mà một đứa trẻ 13 tuổi sẽ hỏi.


4
Chào mừng bạn đến hỏi khác nhau! Một số câu hỏi nâng cao hơn những câu hỏi khác, và điều đó không sao; bạn không cần phải xin lỗi. Nếu bạn có câu hỏi về phần cứng của Apple, phần mềm Apple, các sản phẩm hoặc dịch vụ khác của Apple, phần cứng và phần mềm của bên thứ ba cho các sản phẩm của Apple và đó không phải là về các chủ đề bị cấm trong Câu hỏi thường gặp thì bạn đã đến đúng nơi để đặt câu hỏi cho bạn ! Vì vậy, nếu câu hỏi của bạn thuộc chủ đề, nó được chào đón ở đây, ngay cả khi bạn một đứa trẻ 13 tuổi (nhưng không trẻ hơn, theo các điều khoản dịch vụ ).
Daniel

3
Câu hỏi tuyệt vời - có ít nhất ba cấp độ câu trả lời không tầm thường cho câu hỏi này. Tôi hy vọng điều này nhận được câu trả lời cơ bản, câu trả lời ở giữa và câu trả lời cấp độ "John Siracusa phân tích hoạt động bên trong của cấu trúc nhị phân ứng dụng Mac OS X" để bạn có thể chọn và học hỏi từ tất cả.
bmike

Câu trả lời:


11

Về mặt khái niệm, nó luôn sử dụng API hệ điều hành - câu hỏi chỉ là theo cách nào. Về cơ bản có ba lựa chọn.

  1. sử dụng API hệ điều hành cấp thấp (gọi hệ thống) trực tiếp. Trong ví dụ của bạn, nhiệm vụ khá liên quan: lấy danh sách các mục trong thư mục, kiểm tra loại (thư mục, tệp ...), cho mỗi mục tạo một mục tương ứng trong thư mục đích, cho các tệp đọc nội dung từ nguồn, ghi vào tệp mục tiêu, v.v. Vì nhiệm vụ quá phức tạp, rất dễ gặp phải lỗi, vì vậy hầu hết các ứng dụng sẽ tránh điều này.

  2. sử dụng thư viện (API) để đơn giản hóa công việc. Ví dụ, khung công tác Apple ca cao cung cấp cho NSFileManagerlớp copyItemAtPath:toPath:errorphương thức thực hiện tất cả các công việc bẩn thỉu bằng cách sử dụng API hệ điều hành cấp thấp, vì vậy ứng dụng không cần phải sử dụng API cấp thấp mà có thể dựa vào thứ gì đó đòi hỏi ít công việc hơn và luôn luôn có mặt trong hệ thống. Ngoài ra Apple có khả năng đảm bảo rằng nó hoạt động tốt.

  3. sử dụng một quá trình bên ngoài để thực hiện nhiệm vụ. Trong trường hợp này, quy trình bên ngoài sẽ sử dụng một trong hai phương pháp trên để thực hiện công việc. Ứng dụng phải bắt đầu quá trình như vậy, theo dõi nó và đợi cho đến khi hoàn thành. Có khả năng quá trình đó có thể được chạy như một công cụ dòng lệnh, vì vậy đây có thể là một lệnh bạn có thể chạy trong Terminal. Nó không được đảm bảo, nhưng rất có thể.

Hầu hết các ứng dụng sẽ sử dụng tùy chọn 2. vì nó đơn giản hơn 1. và an toàn và hiệu quả hơn 3. Để chạy một quy trình bên ngoài, bạn cần thiết lập đúng và bạn không kiểm soát được những gì nó làm. Ví dụ, khó hơn nhiều để tìm ra chính xác những gì đã sai trong trường hợp thất bại và thật khó để biết những gì nó đang làm (ví dụ như hiển thị tiến trình). Đó là lý do tại sao trong hầu hết các trường hợp, các nhà phát triển có thể sẽ chọn tùy chọn 2, nhưng không có gì đảm bảo. Một ví dụ đáng chú ý là các ứng dụng sử dụng tập lệnh shell để tùy chỉnh - chẳng hạn như trình cài đặt.

Lưu ý người dùng nâng cao: bạn có thể sử dụng dtracetiện ích của OS X để tìm hiểu xem một ứng dụng cụ thể đang làm gì. Ví dụ: bạn có thể kiểm tra bất kỳ quy trình nào nó đang sinh sản để bạn sẽ thấy các công cụ mà nó đang sử dụng (xem execsnoop).


4

Tôi sợ câu trả lời là "nó phụ thuộc, nhưng thường là thứ hai." Trên thực tế, ngay cả khi một chương trình GUI đang chạy các lệnh đầu cuối, nó sẽ chạy chúng bằng cách gọi API.

Một chương trình đơn giản là một danh sách các lệnh đầu cuối được gọi là tập lệnh shell. Các chương trình như vậy có thể chạy trong Mac OS X, nhưng chúng phải chạy trong cửa sổ Terminal hoặc khởi chạy chương trình sử dụng GUI nếu bạn muốn xem đầu ra của chúng. Các chương trình khác có thể gọi các chương trình dòng lệnh thông qua các API nội bộ.

Mặc dù hầu hết các câu hỏi phát triển đều lạc đề đối với trang web này, một ví dụ thực sự thuộc chủ đề liên quan đến việc chạy Automator.

Một tùy chọn trong danh sách các lệnh nội bộ mà chương trình được tạo trong Automator có thể gọi là khả năng gọi một tập lệnh shell hoặc danh sách các lệnh Terminal. Nhưng đó chỉ là một trong nhiều tùy chọn có sẵn trong API nội bộ của nó.

nhập mô tả hình ảnh ở đây


Nhưng đôi khi các API kết thúc các lệnh gọi mà bạn có thể truy cập từ Terminal. Tôi đã đọc các báo cáo (không có gì tôi quan tâm để sao chép trên máy tính của riêng tôi, cảm ơn bạn rất nhiều) rằng nếu /sbin/shutdownbị hỏng hoặc bị xóa, lệnh Shutdown trong menu Apple sẽ ngừng hoạt động.
Daniel

1
Các kịch bản Shell không phải chạy trong cửa sổ đầu cuối hoặc bất kỳ phần mềm nào khác của cửa sổ. Nhưng nếu họ tạo đầu ra không được chuyển hướng đến một tệp thì bạn có thể chọn chạy nó trong một cửa sổ. Shell script cũng có thể chạy các chương trình khác có windows.
ctrl-alt-delor

@richard Hoàn toàn đúng. Đã chỉnh sửa.
Daniel

2

Một trong những ý tưởng tuyệt vời đằng sau Unix là (nếu) bạn có ý tưởng cho một chương trình, trước tiên bạn sẽ viết nó dưới dạng một tập lệnh shell - về cơ bản gọi một loạt các lệnh.

Sau đó, nếu chương trình tỏ ra hữu ích, bạn có thể cải thiện giao diện của nó, nhờ người dùng kiểm tra và cuối cùng, khi bạn tin chắc rằng nó đáng giá, hãy viết một chương trình "thực".

Tất nhiên, điều này là trước khi các giao diện người dùng đồ họa chiếm lĩnh, do đó, một "chương trình" ở đây là một lệnh CLI.

Bạn vẫn thấy cách tiếp cận này trong một số chương trình hiện đại, đặc biệt nếu chúng hiển thị thông tin hệ thống. Bạn muốn xây dựng một ứng dụng đơn giản để liệt kê tất cả các tệp trong một thư mục? Chỉ cần chạy ls -al, phân tích kết quả và hiển thị nó một bảng. Hãy vui vẻ với các thông số khác nhau và bạn có tài liệu của mình cho phiên bản 2.0


1

Một lớp chương trình chạy các lệnh đầu cuối (mặc dù tất cả bắt đầu bằng lệnh gọi API) là các môi trường phát triển chương trình tích hợp như nhật thực hoặc Xcode. Bộ sưu tập các công cụ cần thiết để phát triển chương trình rất lớn được chứa trong và được duy trì cho một IDE. Thay vào đó, nó xây dựng một tệp tạo tệp (một loại tập lệnh) và chạy nó với unix 'make' (hoặc tương đương) để chuyển qua quá trình biên dịch, liên kết, tải và gỡ lỗi. Lần lượt, thực hiện chạy trình biên dịch, trình liên kết, v.v ... bằng cách sử dụng các giao diện dòng lệnh của chúng. Điều này cho phép IDE tương đối độc lập với bộ công cụ được lập trình viên chọn và không nhạy cảm với các bản cập nhật cho các công cụ.


1

Các ứng dụng có thể chạy các lệnh CLI để thực hiện một tác vụ nhất định và một số thực sự làm; nhưng do vấn đề hiệu quả, các nhà phát triển ứng dụng chuyên nghiệp tránh chạy lệnh và thay vào đó sử dụng các API mà lệnh sử dụng để thực hiện tác vụ được yêu cầu.


Tôi là một kỹ sư phần mềm chuyên nghiệp. Tôi gọi lệnh từ các chương trình của tôi. Tôi thậm chí sẽ tự viết một số hoặc tất cả chúng sau đó viết gui bằng một ngôn ngữ khác. Tuy nhiên tôi sẽ không sử dụng các lệnh cp (sao chép) hoặc mv (di chuyển / đổi tên) vì api để sao chép hoặc đổi tên là đơn giản. Một số dự án phần mềm miễn phí sử dụng kỹ thuật này. Một số người mong đợi đã viết một công cụ dòng lệnh tuyệt vời nhưng khó sử dụng (ví dụ để tạo hình ảnh iso cd và để viết hình ảnh sang cd), chuyên gia gui viết một gui sử dụng cả hai công cụ này, về cơ bản cho phép người dùng định cấu hình các công cụ , để thiết lập chúng đi, và theo dõi tiến trình.
ctrl-alt-delor

Tôi đã sử dụng API giống như từ đơn giản mà câu hỏi đã sử dụng. Trên thực tế, tôi đã viết lại câu trả lời nhiều lần mỗi lần để làm cho khán giả ít quen thuộc hơn với mã đặt dưới và quy ước đặt tên của API so với libs vs Frameworks, v.v. kỹ sư phần mềm chuyên nghiệp khác. Nếu có điều gì đó bạn muốn chỉnh sửa trong bài viết của tôi sẽ làm rõ vấn đề hơn nữa, vui lòng tiếp tục và làm như vậy.
ismail

Không có hành vi phạm tội, tôi chỉ làm rõ. Một lập trình viên giỏi sẽ hoặc không gọi các chương trình dòng lệnh, quyết định sẽ dựa trên mức độ phức tạp và có thể (sau khi đo tốc độ) về hiệu quả. Đối với nhóm nhỏ các chuyên gia bán ra thị trường, có thể cần phải làm cho chương trình của bạn trở nên phức tạp; Gọi một chương trình dòng lệnh, có vẻ chỉ đơn giản. Do đó, viết lại là cần thiết. Nếu bạn làm hoa hồng hoặc Phần mềm miễn phí thì bạn sẽ làm điều đơn giản nhất.
ctrl-alt-delor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.