En basit haliyle, programlar sadece terminal komutlarını çalıştırıyor mu?


18

Diyelim ki bir programda bir klasör seçip başka bir konuma kopyalamama izin veriyor, çok temel düzeyde uygulama terminalde çalıştırabileceğim komutları çalıştırıyor mu yoksa bu hareketi yapmak için bazı dahili OS API kullanıyor mu?

Lütfen herhangi bir kısır yanıtı bana verin; Sadece merak ediyorum ve 13 yaşındaki bir çocuğun sorduğu bir soru olarak algılanabileceğinin tamamen farkındayım.


4
Farklı Sormaya hoş geldiniz! Bazı sorular diğerlerinden daha ileridir ve sorun değil; özür dilemene gerek yok. Apple donanımı, Apple yazılımı, diğer Apple ürünleri veya hizmetleri, Apple ürünleri için üçüncü taraf donanımı ve yazılımı hakkında bir sorunuz varsa ve SSS'de yasaklanan konularla ilgili değilse , sorunuzu sormak için doğru yerdesiniz ! Yani konuyla, o bile burada hoşgeldin soru ise şunlardır (başına, ancak hiçbir genç 13 yaşındaki hizmet şartlarını ).
Daniel

3
Harika soru - bu soruya en az üç önemsiz cevap seviyesi var. Umarım bu temel bir cevap, orta bir cevap alır ve "John Siracusa, Mac OS X uygulama ikili yapısının iç işleyişini keser", böylece her şeyi seçebilir ve öğrenebilirsiniz.
bmike

Yanıtlar:


11

Kavramsal olarak, her zaman OS API'sini kullanır - soru sadece ne şekilde. Esasen üç seçenek vardır.

  1. doğrudan düşük seviyeli OS API (sistem çağrıları) kullanarak. Örneğinizde görev oldukça ilgili: klasördeki öğelerin listesini alın, türü kontrol edin (klasör, dosya ...), her biri hedef klasörde karşılık gelen öğeyi oluşturun, dosyalar için içeriği kaynak, hedef dosyaya yazma vb. Görev çok karmaşık olduğu için, yanlış bir şey almak kolaydır, bu yüzden çoğu uygulama bundan kaçınacaktır.

  2. görevi basitleştiren bir kitaplık (API) kullanın. Örneğin, Apple Cocoa çerçevesi, düşük düzeyli OS API kullanarak tüm kirli işleri NSFileManageryapan copyItemAtPath:toPath:erroryöntemle sınıfa sahiptir , bu nedenle uygulamanın düşük düzeyli API'yi kullanması gerekmez, ancak daha az çalışma gerektiren bir şeye güvenebilir ve her zaman sistemde mevcut. Ayrıca Apple'ın iyi çalıştığından emin olması muhtemeldir.

  3. görevi yapmak için harici bir işlem kullanın. Bu durumda, harici işlem işi yapmak için yukarıdaki iki yöntemden birini kullanacaktır. Uygulama böyle bir işlemi başlatmak, izlemek ve bitene kadar beklemek zorundadır. Bu tür bir işlemin komut satırı aracı olarak çalıştırılabilmesi muhtemeldir, bu nedenle bu, Terminal'de çalıştırabileceğiniz bir komut olacaktır. Garantili değil, çok mümkün.

Çoğu uygulama 2 seçeneğini kullanır. Çünkü 1'den daha basit ve 3'ten daha güvenli ve verimlidir. Harici bir işlemi çalıştırmak için düzgün bir şekilde ayarlamanız gerekir ve ne yaptığı üzerinde hiçbir kontrolünüz yoktur. Örneğin, bir arıza durumunda neyin yanlış gittiğini anlamak çok daha zordur ve ne yaptığını bilmek zordur (örneğin ilerleme durumunu göster). Bu nedenle, çoğu durumda geliştiriciler muhtemelen seçenek 2'yi seçecektir, ancak garanti yoktur. Dikkate değer bir örnek, özelleştirme için kabuk komut dosyaları kullanan (yükleyiciler gibi) uygulamalardır.

Gelişmiş kullanıcı notu: dtraceBelirli bir uygulamanın ne yaptığını öğrenmek için OS X özelliğini kullanabilirsiniz . Örneğin, kullandığı tüm süreçleri kontrol edebilir, böylece kullandığı araçları görürsünüz (bkz. execsnoop).


4

Korkarım cevap "duruma bağlıdır, ancak genellikle ikincisidir". Aslında, bir GUI programı terminal komutlarını çalıştırsa bile, bunları bir API çağırarak çalıştırır.

Sadece terminal komutlarının bir listesi olan programa kabuk betiği denir. Bu tür programlar Mac OS X'te çalışabilir, ancak bir Terminal penceresinde çalışmaları veya çıktılarını görmek istiyorsanız GUI'yi kullanan bir programı başlatmaları gerekir. Diğer programlar dahili API'ler aracılığıyla komut satırı programlarını çağırabilir.

Çoğu geliştirme sorusu bu site için konu dışı olsa da, aslında konuyla ilgili bir örnek Automator'u çalıştırmayı içerir.

Automator'da oluşturulan bir programın çağırabileceği dahili komutlar listesindeki bir seçenek, bir kabuk komut dosyasını veya Terminal komutlarının listesini arama yeteneğidir. Ancak bu, dahili API'sında bulunan birçok seçenekten sadece biridir.

resim açıklamasını buraya girin


Ancak bazen API'lar Terminal'den erişebileceğiniz komutları çağırır. /sbin/shutdownHasarlı veya silinmişse, Apple menüsündeki Kapat komutunun çalışmayı bıraktığı raporları (kendi bilgisayarımda çoğaltmak istediğim hiçbir şey yok, çok teşekkür ederim) okudum .
Daniel

1
Kabuk komut dosyalarının bir terminal penceresinde veya başka bir yazılım penceresinde çalışması gerekmez. Ancak bir dosyaya yönlendirilmeyen çıktılar üretiyorlarsa, bunu bir pencerede çalıştırmayı seçebilirsiniz. Kabuk komut dosyaları, pencereleri olan diğer programları da çalıştırabilir.
ctrl-alt-delor

@richard Kesinlikle doğru. Düzenlenen.
Daniel

2

Unix'in arkasındaki harika fikirlerden biri, bir program için bir fikriniz varsa, önce bir kabuk betiği olarak yazmanız gerektiğiydi - aslında bir dizi komut çağırıyor.

Daha sonra, programın yararlı olduğu kanıtlanırsa, arayüzünü geliştirebilir, kullanıcıların test etmesini sağlayabilir ve nihayetinde buna değdiğine ikna olduğunuzda "gerçek" bir program yazabilirsiniz.

Bu, elbette, grafiksel kullanıcı arayüzleri devralmadan önceydi, bu yüzden burada bir "program" kendi başına bir CLI komutudur.

Bazı modern programlarda, özellikle sistem bilgileri gösteriliyorsa, bu yaklaşımı görüyorsunuz. Bir klasördeki tüm dosyaları listelemek için basit bir uygulama oluşturmak ister misiniz? Sadece koş ls -al, sonucu ayrıştır ve bir tablo göster. Çeşitli parametrelerle eğlenin ve sürüm 2.0 için malzemeniz var


1

Terminal komutlarını çalıştıran bir program sınıfı (tümü bir API çağrısı ile başlasa bile) eclipse veya Xcode gibi entegre program geliştirme ortamlarıdır. Program geliştirme için gerekli araçların toplanması, bir IDE'de yer alması ve sürdürülmesi için büyük ölçüde büyüktür. Bunun yerine, bir makefile (bir tür komut dosyası) oluşturur ve derleme, bağlantı, yükleme ve hata ayıklama işleminde gezinmek için unix 'make' (veya eşdeğeri) ile çalışır. Sırasıyla, komut satırı arabirimlerini kullanarak derleyiciyi, bağlayıcıyı vb. Çalıştırır. Bu, IDE'nin programcı tarafından seçilen araç setinden nispeten bağımsız olmasını ve araç güncellemelerine duyarsız olmasını sağlar.


1

Uygulamalar belirli bir görevi yerine getirmek için CLI komutlarını çalıştırabilir ve bazıları aslında bunu yapabilir; ancak verimlilik sorunları nedeniyle, profesyonel uygulama geliştiricileri komutu çalıştırmaktan kaçınır ve bunun yerine komutun gereken görevi yerine getirmek için kullandığı API'leri kullanır.


Ben profesyonel bir yazılım mühendisiyim. Programlarımdan komut çağırıyorum. Hatta bir kısmını veya tamamını kendim yazacağım, sonra gui'yi farklı bir dilde yazacağım. Ancak kopyalamak veya yeniden adlandırmak için api basit olarak cp (kopya) veya mv (taşıma / yeniden adlandırma) komutları kullanmak olmaz. Bazı Özgür Yazılım projeleri bu tekniği kullanır. Bazı beklentiler mükemmel ama kullanımı zor bir komut satırı araçları yazmıştır (örneğin, bir iso cd görüntüsü oluşturmak ve cd'ye bir görüntü yazmak için) gui uzmanı, her iki aracı da kullanan bir gui yazar ve temel olarak bir kullanıcının araçları yapılandırmasına izin verir , ilerlemesini izlemek için.
ctrl-alt-delor

Kullandığım API sadece soru kullandığı basit kelime olarak. Aslında, cevabı her seferinde birkaç kez yeniden yazdım, daha az tanıdık kitle için döşeme kodu ve API vs libs vs Frameworks vb. Adlandırma kuralları ile bunu yazdım. diğer profesyonel yazılım mühendisi. Yayımımda düzenlemek istediğiniz ve konuyu daha da netleştirecek bir şey varsa, lütfen devam edin ve yapın.
ismail

Suç yok, sadece açıklığa kavuşuyorum. İyi bir programcı komut satırı programlarını çağırır veya alıştırmaz, karar karmaşıklığa ve muhtemelen (hızı ölçtükten sonra) verimliliğe dayanır. Pazara satış yapan küçük profesyoneller grubu için programınızı karmaşık hale getirme ihtiyacı olabilir; Bir komut satırı programı çağırmak, sadece basit görünebilir. Bu nedenle yeniden yazma gerekir. Komisyonlar veya Free-Software yaparsanız, işe yarayan en basit şeyi yaparsınız.
ctrl-alt-delor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.