Czy w najprostszej postaci programy po prostu uruchamiają polecenia terminala?

18

Powiedzmy na przykład, że program pozwala mi wybrać jeden folder i skopiować go do innej lokalizacji, czy na bardzo podstawowym poziomie jest to, że aplikacja uruchamia polecenia, które mógłbym uruchomić w terminalu, czy używa jakiegoś wewnętrznego interfejsu API systemu operacyjnego, aby to przenieść?

Proszę oszczędzić mi wszelkich błędnych odpowiedzi; Jestem tylko ciekawy i całkowicie świadomy, że można to postrzegać jako pytanie, które zadałby 13-latek.

azz0r
źródło
4
Witamy, aby zapytać inaczej! Niektóre pytania są bardziej zaawansowane niż inne i jest w porządku; nie musisz przepraszać. Jeśli masz pytanie dotyczące sprzętu Apple, oprogramowania Apple, innych produktów lub usług Apple, sprzętu i oprogramowania innych firm do produktów Apple i nie dotyczy to tematów zabronionych w FAQ, to jesteś we właściwym miejscu, aby zadać pytanie ! Jeśli więc Twoje pytanie jest na temat, to jest tu mile widziany, nawet jeśli 13-letni (ale nie młodszy, za tych warunków korzystania z usługi ).
Daniel
3
Świetne pytanie - istnieją co najmniej trzy nietrywialne poziomy odpowiedzi na to pytanie. Mam nadzieję, że otrzyma odpowiedź podstawową, środkową i odpowiedź „John Siracusa analizuje wewnętrzne funkcjonowanie struktury binarnej aplikacji systemu Mac OS X”, dzięki czemu możesz wybierać i uczyć się od wszystkich.
bmike

Odpowiedzi:

11

Pod względem koncepcyjnym zawsze używa OS API - pytanie dotyczy tylko tego, w jaki sposób. Istnieją zasadniczo trzy opcje.

  1. za pomocą bezpośredniego interfejsu API systemu operacyjnego (wywołania systemowe). W twoim przykładzie zadanie jest dość zaangażowane: pobierz listę elementów w folderze, sprawdź typ (folder, plik ...), dla każdego z nich utwórz odpowiedni element w folderze docelowym, dla plików odczytaj zawartość z źródło, zapisz do pliku docelowego itp. Ponieważ zadanie jest tak złożone, łatwo jest coś zrobić źle, więc większość aplikacji tego uniknie.

  2. użyj biblioteki (API), która upraszcza zadanie. Na przykład framework Apple Cocoa zapewnia NSFileManagerklasie copyItemAtPath:toPath:errormetodę, która wykonuje całą brudną pracę przy użyciu niskopoziomowego interfejsu API systemu operacyjnego, więc aplikacja nie musi korzystać z samego interfejsu API niskiego poziomu, ale może polegać na czymś, co wymaga mniej pracy i zawsze jest obecny w systemie. Również Apple może upewnić się, że działa dobrze.

  3. użyj zewnętrznego procesu do wykonania zadania. W takim przypadku proces zewnętrzny będzie używał jednej z dwóch powyższych metod do wykonania pracy. Aplikacja musi rozpocząć taki proces, monitorować go i poczekać, aż się zakończy. Jest prawdopodobne, że taki proces można uruchomić jako narzędzie wiersza polecenia, więc prawdopodobnie będzie to polecenie, które można uruchomić w terminalu. Nie jest to gwarantowane, ale bardzo możliwe.

Większość aplikacji korzysta z opcji 2., ponieważ jest prostsza niż 1. oraz bezpieczniejsza i wydajniejsza niż 3. Aby uruchomić proces zewnętrzny, musisz go poprawnie skonfigurować i nie masz kontroli nad tym, co robi. Na przykład o wiele trudniej jest dowiedzieć się, co dokładnie poszło nie tak w przypadku awarii i trudno jest wiedzieć, co robi (np. Pokazać postęp). Dlatego w większości przypadków programiści prawdopodobnie wybiorą opcję 2, ale nie ma gwarancji. Godnym uwagi przykładem są aplikacje wykorzystujące skrypty powłoki do dostosowywania - takie jak instalatory.

Uwaga dla zaawansowanych użytkowników: możesz użyć dtracefunkcji OS X, aby dowiedzieć się, co robi konkretna aplikacja. Na przykład możesz sprawdzić wszystkie procesy, które się odradza, aby zobaczyć narzędzia, których używa (patrz execsnoop).

Simon Urbanek
źródło
4

Obawiam się, że odpowiedź brzmi „to zależy, ale zwykle druga”. W rzeczywistości nawet jeśli program GUI uruchamia polecenia terminalu, uruchamia je, wywołując interfejs API.

Program będący po prostu listą poleceń terminalowych nazywa się skryptem powłoki. Takie programy mogą działać w systemie Mac OS X, ale muszą albo uruchomić się w oknie terminala, albo uruchomić program korzystający z GUI, jeśli chcesz zobaczyć ich wyniki. Inne programy mogą wywoływać programy wiersza poleceń za pośrednictwem wewnętrznych interfejsów API.

Podczas gdy większość pytań programistycznych jest nie na temat tej witryny, jeden przykład, który jest na ten temat, dotyczy uruchomienia Automatora.

Jedną z opcji na liście poleceń wewnętrznych, które może wywoływać program utworzony w programie Automator, jest możliwość wywołania skryptu powłoki lub listy poleceń terminalu. Ale to tylko jedna z wielu opcji dostępnych w jej wewnętrznym interfejsie API.

wprowadź opis zdjęcia tutaj

Daniel
źródło
Jednak czasami interfejsy API wywołują polecenia, do których można uzyskać dostęp z poziomu terminala. Przeczytałem raporty (nic, co nie chce mi się powielać na własnym komputerze, bardzo dziękuję), że jeśli /sbin/shutdownzostanie uszkodzone lub usunięte, polecenie Zamknij w menu Apple przestaje działać.
Daniel
1
Skrypty powłoki nie muszą działać w oknie terminala ani w żadnym innym oknie dialogowym. Ale jeśli generują dane wyjściowe, które nie są przekierowywane do pliku, możesz uruchomić je w oknie. Skrypty powłoki mogą również uruchamiać inne programy z oknami.
ctrl-alt-delor
@richard Absolutnie racja. Edytowane.
Daniel
2

Jednym z wielkich pomysłów Unixa jest (było), że jeśli masz pomysł na program, najpierw napiszesz go jako skrypt powłoki - w zasadzie wywołując serię poleceń.

Następnie, jeśli program okaże się przydatny, możesz ulepszyć jego interfejs, poprosić użytkowników o przetestowanie go, a na koniec, gdy będziesz przekonany, że warto, napisz „prawdziwy” program.

Było to oczywiście przed przejęciem graficznych interfejsów użytkownika, więc „program” jest tutaj poleceniem CLI.

Nadal widzisz to podejście w niektórych nowoczesnych programach, szczególnie jeśli pokazują one informacje o systemie. Chcesz zbudować prostą aplikację do wyświetlania listy wszystkich plików w folderze? Po prostu uruchom ls -al, przeanalizuj wynik i pokaż mu tabelę. Baw się dobrze z różnymi parametrami, a masz materiał do wersji 2.0

Monolo
źródło
1

Jedną klasą programów, które uruchamiają polecenia terminala (mimo że wszystko zaczyna się od wywołania API), są zintegrowane środowiska programistyczne, takie jak eclipse lub Xcode. Zbiór narzędzi wymaganych do opracowania programu jest zbyt duży, aby mógł być zawarty w IDE i utrzymywany w nim. Zamiast tego buduje plik makefile (rodzaj skryptu) i uruchamia go z uniksowym „make” (lub odpowiednikiem), aby przejść przez proces kompilacji, łączenia, ładowania i debugowania. Make z kolei uruchamia kompilator, konsolidator itp. Za pomocą interfejsów wiersza poleceń. Dzięki temu IDE jest względnie niezależny od zestawu narzędzi wybranego przez programistę i niewrażliwy na aktualizacje narzędzi.

JRobert
źródło
1

Aplikacje mogą uruchamiać polecenia CLI w celu wykonania określonego zadania, a niektóre faktycznie; ale ze względu na problemy z wydajnością profesjonalni twórcy aplikacji unikają uruchamiania polecenia i raczej używają interfejsów API używanych przez polecenie do wykonania wymaganego zadania.

ismail
źródło
Jestem profesjonalnym inżynierem oprogramowania. Wywołuję polecenia z moich programów. Sam nawet napiszę niektóre lub wszystkie z nich, a następnie napisz gui w innym języku. Nie używałbym jednak poleceń cp (kopiuj) ani mv (przenieś / zmień nazwę), ponieważ interfejs do kopiowania lub zmiany nazwy jest prosty. Niektóre projekty Wolnego Oprogramowania wykorzystują tę technikę. Niektórzy spodziewają się, że napisali doskonałe, ale trudne w użyciu narzędzia wiersza poleceń (np. Do stworzenia obrazu dysku CD ISO i zapisu obrazu na dysku CD), ekspert GUI pisze GUI, które korzysta z obu tych narzędzi, w zasadzie pozwalając użytkownikowi na konfigurację narzędzi , aby je uruchomić i monitorować postępy.
ctrl-alt-delor
Użyłem API tak prostego słowa, jakiego użyło pytanie. Właściwie, kilkakrotnie przepisałem odpowiedź za każdym razem, czyniąc ją mniej znaną publiczności z podstawowymi kodami i konwencjami nazewnictwa API vs. libs vs. Frameworks itp. Nie miałem na myśli obrazić ciebie ani twojego zawodu @richrad, ani żadnego inny profesjonalny inżynier oprogramowania. Jeśli jest coś, co chcesz edytować w moim poście, który wyjaśniłby tę kwestię dalej, przejdź dalej i zrób to.
ismail
Nie ma urazy, ja tylko wyjaśniam. Dobry programista będzie lub nie będzie wywoływał programów wiersza poleceń, decyzja będzie oparta na złożoności i ewentualnie (po zmierzeniu prędkości) na wydajności. W przypadku niewielkiej grupy specjalistów sprzedających na rynku może być konieczne, aby Twój program był złożony; Wywołanie programu wiersza poleceń może wydawać się proste. Dlatego konieczne jest przepisanie. Jeśli robisz prowizje lub Wolne Oprogramowanie, robisz najprostszą rzecz, która działa.
ctrl-alt-delor