Dalam bentuknya yang paling sederhana, apakah program hanya menjalankan perintah terminal?


18

Katakanlah misalnya dalam sebuah program itu memungkinkan saya memilih satu folder dan menyalinnya ke lokasi lain, pada tingkat yang sangat dasar adalah aplikasi yang menjalankan perintah yang bisa saya jalankan di terminal atau apakah itu menggunakan beberapa API OS internal untuk membuat langkah itu?

Tolong hindarkan saya tanggapan ganas; Saya hanya ingin tahu dan benar-benar sadar bahwa itu dapat dianggap sebagai pertanyaan yang akan diajukan oleh anak berusia 13 tahun.


4
Selamat Datang di Tanya Berbeda! Beberapa pertanyaan lebih maju daripada yang lain, dan tidak apa-apa; Anda tidak perlu meminta maaf. Jika Anda memiliki pertanyaan tentang perangkat keras Apple, perangkat lunak Apple, produk atau layanan Apple lainnya, perangkat keras dan perangkat lunak pihak ketiga untuk produk Apple, dan ini bukan tentang topik yang dilarang dalam FAQ, maka Anda berada di tempat yang tepat untuk mengajukan pertanyaan Anda ! Jadi, jika pertanyaan Anda sesuai topik, itu diterima di sini, bahkan jika Anda berusia 13 tahun (tetapi tidak lebih muda, sesuai ketentuan layanan ).
Daniel

3
Pertanyaan bagus - setidaknya ada tiga tingkat jawaban yang tidak sepele untuk pertanyaan ini. Saya harap ini mendapatkan jawaban dasar, jawaban tengah, dan jawaban "John Siracusa membedah cara kerja struktur biner aplikasi Mac OS X" sehingga Anda dapat memilih dan belajar dari semuanya.
bmike

Jawaban:


11

Secara konseptual, selalu menggunakan OS API - pertanyaannya hanya dengan cara apa. Pada dasarnya ada tiga opsi.

  1. menggunakan API OS tingkat rendah (panggilan sistem) secara langsung. Dalam contoh Anda, tugasnya cukup terlibat: dapatkan daftar item dalam folder, periksa jenisnya (folder, file ...), untuk masing-masing membuat item yang sesuai di folder target, untuk file membaca konten dari sumber, tulis ke file target dll. Karena tugasnya sangat kompleks, mudah untuk mendapatkan sesuatu yang salah, sehingga sebagian besar aplikasi akan menghindari ini.

  2. menggunakan perpustakaan (API) yang menyederhanakan tugas. Misalnya kerangka kerja Apple Cocoa menyediakan NSFileManagerkelas dengan copyItemAtPath:toPath:errormetode yang melakukan semua pekerjaan kotor menggunakan OS tingkat rendah, sehingga aplikasi tidak perlu menggunakan API tingkat rendah itu sendiri tetapi dapat mengandalkan sesuatu yang membutuhkan lebih sedikit pekerjaan dan selalu hadir dalam sistem. Apple juga cenderung memastikan bahwa itu bekerja dengan baik.

  3. gunakan proses eksternal untuk melakukan tugas. Dalam hal ini proses eksternal akan menggunakan salah satu dari dua metode di atas untuk melakukan pekerjaan. Aplikasi harus memulai proses tersebut, memonitornya dan menunggu sampai selesai. Kemungkinan proses tersebut dapat dijalankan sebagai alat baris perintah, jadi ini kemungkinan akan menjadi perintah yang dapat Anda jalankan di Terminal. Itu tidak dijamin, tetapi sangat mungkin.

Sebagian besar aplikasi akan menggunakan opsi 2. karena lebih sederhana dari 1. dan lebih aman dan efisien daripada 3. Untuk menjalankan proses eksternal, Anda perlu mengaturnya dengan benar dan Anda tidak memiliki kendali atas apa yang dilakukannya. Misalnya jauh lebih sulit untuk mencari tahu apa yang sebenarnya salah jika terjadi kegagalan dan sulit untuk mengetahui apa yang dilakukannya (misalnya menunjukkan kemajuan). Itulah sebabnya dalam kebanyakan kasus pengembang kemungkinan akan memilih opsi 2, tetapi tidak ada jaminan. Contoh penting adalah aplikasi yang menggunakan skrip shell untuk penyesuaian - seperti installer.

Catatan pengguna tingkat lanjut: Anda dapat menggunakan dtracefasilitas OS X untuk mengetahui apa yang sedang dilakukan aplikasi tertentu. Misalnya, Anda dapat memeriksa proses apa pun yang dimunculkan sehingga Anda akan melihat alat yang digunakannya (lihat execsnoop).


4

Saya khawatir jawabannya adalah "itu tergantung, tetapi biasanya yang kedua." Sebenarnya, bahkan jika program GUI menjalankan perintah terminal, ia menjalankannya dengan memanggil API.

Program yang hanya berupa daftar perintah terminal disebut skrip shell. Program semacam itu dapat berjalan di Mac OS X, tetapi harus dijalankan di jendela Terminal atau meluncurkan program yang menggunakan GUI jika Anda ingin melihat hasilnya. Program lain dapat memanggil program baris perintah melalui API internal.

Sementara sebagian besar pertanyaan pengembangan di luar topik untuk situs ini, satu contoh yang sebenarnya on-topic melibatkan menjalankan Automator.

Salah satu opsi dalam daftar perintah internal yang dibuat oleh program yang dibuat oleh Automator adalah kemampuan untuk memanggil skrip shell, atau daftar perintah Terminal. Tapi itu hanya satu dari banyak opsi yang tersedia dalam API internal.

masukkan deskripsi gambar di sini


Namun terkadang API akhirnya memanggil perintah yang bisa Anda akses dari Terminal. Saya sudah membaca laporan (tidak ada yang ingin saya tiru di komputer saya sendiri, terima kasih banyak) bahwa jika /sbin/shutdownrusak atau dihapus, perintah Shutdown di menu Apple berhenti berfungsi.
Daniel

1
Skrip shell tidak harus dijalankan di jendela terminal atau jendela lunak lainnya. Tetapi jika mereka menghasilkan output yang tidak diarahkan ke file maka Anda dapat memilih untuk menjalankannya di jendela. Script Shell juga dapat menjalankan program lain yang memiliki windows.
ctrl-alt-delor

@ Richard Benar sekali. Diedit.
Daniel

2

Salah satu ide hebat di balik Unix adalah (adalah) bahwa jika Anda mendapat ide untuk sebuah program, maka Anda pertama-tama akan menulisnya sebagai skrip shell - pada dasarnya memanggil serangkaian perintah.

Kemudian, jika program terbukti bermanfaat, Anda dapat meningkatkan antarmuka, meminta pengguna mengujinya, dan akhirnya, ketika Anda yakin itu layak, tulislah program "nyata".

Ini, tentu saja, sebelum antarmuka pengguna grafis mengambil alih, jadi "program" di sini adalah perintah CLI itu sendiri.

Anda masih melihat pendekatan ini di beberapa program modern, terutama jika mereka menunjukkan informasi sistem. Ingin membuat aplikasi sederhana untuk mencantumkan semua file dalam folder? Jalankan saja ls -al, uraikan hasilnya dan perlihatkan tabel. Bersenang-senang dengan berbagai parameter, dan Anda memiliki materi untuk versi 2.0


1

Satu kelas program yang menjalankan perintah terminal (meskipun semuanya dimulai dengan panggilan API) adalah lingkungan pengembangan program terintegrasi seperti gerhana atau Xcode. Kumpulan alat-alat yang diperlukan untuk pengembangan program sangat besar untuk terkandung dalam, dan dipelihara untuk, sebuah IDE. Sebagai gantinya, ia membangun makefile (semacam skrip) dan menjalankannya dengan unix 'make' (atau yang setara) untuk melangkah melalui proses kompilasi, tautan, muat, dan debug. Pada gilirannya, jalankan kompiler, tautan, dll. Menggunakan antarmuka baris perintah mereka. Ini memungkinkan IDE relatif independen dari set alat yang dipilih oleh programmer, dan tidak sensitif terhadap pembaruan pada alat.


1

Aplikasi dapat menjalankan perintah CLI untuk melakukan tugas tertentu, dan beberapa benar-benar melakukannya; tetapi karena masalah efisiensi, pengembang aplikasi profesional menghindari menjalankan perintah dan lebih suka menggunakan API yang digunakan perintah untuk melakukan tugas yang diperlukan.


Saya seorang insinyur perangkat lunak profesional. Saya memanggil perintah dari program saya. Saya bahkan akan menulis beberapa atau semuanya sendiri kemudian menulis gui dalam bahasa yang berbeda. Namun saya tidak akan menggunakan perintah cp (copy) atau mv (move / rename) karena api untuk menyalin atau mengganti nama itu sederhana. Beberapa proyek Perangkat Lunak Bebas menggunakan teknik ini. Beberapa mengharapkan telah menulis alat baris perintah yang sangat baik tetapi sulit untuk digunakan (misalnya untuk membuat gambar iso cd, dan untuk menulis gambar ke cd) ahli gui menulis gui yang menggunakan kedua alat ini, pada dasarnya memungkinkan pengguna untuk mengkonfigurasi alat , untuk mengaturnya, dan memantau kemajuan.
ctrl-alt-delor

Saya menggunakan API seperti kata sederhana yang digunakan pertanyaan. Sebenarnya, saya telah menulis ulang jawabannya beberapa kali setiap kali menjadikannya untuk audiens yang kurang akrab dengan kode yang tidak terletakkan dan konvensi penamaan API vs libs vs Frameworks dll. Saya tidak bermaksud menyinggung Anda atau profesi Anda @richrad, atau untuk setiap insinyur perangkat lunak profesional lainnya. Jika ada sesuatu yang ingin Anda edit di posting saya yang akan mengklarifikasi masalah ini lebih lanjut, silakan lanjutkan.
ismail

Tidak ada pelanggaran, saya hanya klarifikasi. Seorang programmer yang baik akan atau tidak akan memanggil program command line, keputusan akan didasarkan pada kompleksitas dan mungkin (setelah mengukur kecepatan) pada efisiensi. Untuk sekelompok kecil profesional yang menjual ke pasar, mungkin ada kebutuhan untuk membuat program Anda kompleks; Memanggil program baris perintah, bisa tampak sederhana. Oleh karena itu diperlukan penulisan ulang. Jika Anda melakukan komisi atau Perangkat Lunak Bebas maka Anda melakukan hal paling sederhana yang berhasil.
ctrl-alt-delor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.