Чи в їх найпростішому вигляді програми просто виконують термінальні команди?


18

Скажімо, наприклад, в програмі вона дозволяє мені вибрати одну папку і скопіювати її в інше місце, на самому базовому рівні це те, що програми, які виконують команди, які я міг би запускати в терміналі, або це використовується якийсь внутрішній API OS, щоб зробити цей рух?

Будь ласка, шкодуйте мене будь-яких порочних відповідей; Мені просто цікаво і я цілком усвідомлюю, що це можна сприймати як запитання, яке задасть 13-річна дитина.


4
Ласкаво просимо в "Запитайте різних"! Деякі питання є більш розвиненими, ніж інші, і це нормально; не потрібно вибачатися. Якщо у вас є запитання щодо апаратних засобів Apple, програмного забезпечення Apple, інших продуктів або послуг Apple, сторонніх апаратних засобів та програмного забезпечення для продуктів Apple, і це не тематика, заборонена в FAQ, тоді ви в правильному місці, щоб задати своє запитання ! Так що, якщо ваше запитання по темі, це вітати тут, навіть якщо ви перебуваєте в 13-річний (але не молодше, згідно з умовами служби ).
Даниїл

3
Чудове запитання - є щонайменше три нетривіальні рівні відповідей на це питання. Я сподіваюся, що це отримає основну відповідь, середню, і відповідь "Джон Сіракуза розсікає внутрішню роботу бінарної структури додатків Mac OS X", щоб ви могли вибрати і навчитися з усіх.
bmike

Відповіді:


11

Концептуально він завжди використовує API OS - питання лише в тому, яким способом. По суті є три варіанти.

  1. безпосередньо використовуючи API низького рівня (системні дзвінки). У вашому прикладі завдання досить задіяне: отримайте список елементів у папці, перевірте тип (папку, файл ...), для кожного з них створіть відповідний елемент у цільовій папці, щоб файли читали вміст із джерело, запишіть у цільовий файл і т. д. Оскільки завдання настільки складне, легко щось помилитися, тому більшість програм уникають цього.

  2. використовувати бібліотеку (API), яка спрощує завдання. Наприклад, Apple Cocoa Framework надає NSFileManagerкласу copyItemAtPath:toPath:errorметод, який виконує всю брудну роботу за допомогою API низького рівня, тому додатку не потрібно використовувати API низького рівня, але може покладатися на те, що вимагає меншої роботи і завжди присутній у системі. Також Apple, ймовірно, переконається, що вона працює добре.

  3. використовувати зовнішній процес для виконання завдання. У цьому випадку зовнішній процес буде використовувати один з двох вищевказаних методів. Додаток повинен запустити такий процес, відстежувати його і чекати, поки це буде зроблено. Цілком ймовірно, що такий процес можна запустити як інструмент командного рядка, тому це, швидше за все, буде командою, яку можна запустити в терміналі. Це не гарантується, але дуже можливо.

Більшість додатків використовуватимуть варіант 2. тому що він простіший за 1. та більш безпечний та ефективний, ніж 3. Для запуску зовнішнього процесу вам потрібно його правильно налаштувати і у вас немає контролю над тим, що він робить. Наприклад, набагато важче зрозуміти, що саме пішло не так у разі невдачі, і важко знати, що це робиться (наприклад, показати прогрес). Ось чому в більшості випадків розробники, ймовірно, виберуть варіант 2, але гарантії немає. Помітний приклад - програми, які використовують сценарії оболонки для налаштування - наприклад, інсталятори.

Попередня примітка користувача: ви можете використовувати dtraceзасоби OS X, щоб дізнатися, що робить певна програма. Наприклад, ви можете перевірити будь-які процеси, які він нерестує, щоб ви побачили інструменти, які він використовує (див. execsnoop).


4

Боюся, що відповідь "це залежить, але зазвичай друге". Насправді, навіть якщо програма GUI виконує термінальні команди, вона запускає їх, викликаючи API.

Програма, яка є просто списком термінальних команд, називається скриптом оболонки. Такі програми можуть працювати в Mac OS X, але вони повинні або запускатися у вікні терміналу, або запускати програму, яка використовує графічний інтерфейс, якщо ви хочете побачити їх вихід. Інші програми можуть викликати програми командного рядка через внутрішні API.

Хоча більшість питань щодо розробки для цього сайту є позатематичними, один із прикладів, які насправді є тематичними, передбачає запуск Автоматизатора.

Одним із варіантів списку внутрішніх команд, який може створити програма, створена в Automator, є можливість викликати скрипт оболонки або список команд терміналу. Але це лише багато варіантів, наявних у його внутрішньому API.

введіть тут опис зображення


Але іноді API закінчуються командами виклику, до яких можна отримати доступ з терміналу. Я читав звіти (нічого мені не хочеться копіювати на власному комп’ютері, велике спасибі), що в разі /sbin/shutdownпошкодження або видалення команда "Завершення роботи" в меню Apple перестає працювати.
Даниїл

1
Сценарії оболонки не повинні працювати у вікні терміналу чи будь-якому іншому програмному забезпеченні. Але якщо вони дають вихід, який не перенаправлений на файл, то ви можете запустити його у вікні. Сценарії оболонки можуть також запускати інші програми, у яких є вікна.
ctrl-alt-delor

@richard Абсолютно прав. Відредаговано.
Даниїл

2

Однією з чудових ідей Unix є (було) те, що якби у вас з’явилася ідея для програми, то ви спершу напишете її як сценарій оболонки - по суті викликаючи серію команд.

Потім, якщо програма виявилася корисною, ви можете покращити її інтерфейс, запропонувати користувачам перевірити її, і, нарешті, коли ви переконалися, що вона того варта, напишіть "справжню" програму.

Це, звичайно, було ще до того, як графічні інтерфейси користувача перейняли, тому "програма" тут є командою CLI сама по собі.

Ви все ще бачите такий підхід у деяких сучасних програмах, особливо якщо вони показують системну інформацію. Хочете створити простий додаток, щоб перелічити всі файли в папці? Просто запустіть ls -al, проаналізуйте результат і покажіть йому таблицю. Веселіться з різними параметрами, і у вас є матеріал для версії 2.0


1

Один клас програм, які виконують термінальні команди (навіть якщо все починається з виклику API), - це інтегровані середовища розробки програм, такі як eclipse або Xcode. Колекція інструментів, необхідних для розробки програми, надмірно велика, щоб міститись і підтримуватися для IDE. Натомість він створює makefile (своєрідний скрипт) і запускає його з unix 'make' (або еквівалент), щоб перейти через процес компіляції, посилання, завантаження та налагодження. Зробити, у свою чергу, запускає компілятор, лінкер тощо, використовуючи їхні інтерфейси командного рядка. Це дозволяє IDE бути відносно незалежним від набору інструментів, обраного програмістом, і не чутливим до оновлень інструментів.


1

Програми можуть запускати команди CLI для виконання певного завдання, а деякі насправді роблять; але через проблеми з ефективністю професійні розробники додатків уникають запуску команди і скоріше використовують API, які використовує команда для виконання необхідної задачі.


Я професійний інженер програмного забезпечення. Я викликаю команди зі своїх програм. Я навіть сам напишу деякі чи всі, а потім напишу гуї іншою мовою. Однак я не використовую команди cp (copy) або mv (move / rename), оскільки api для копіювання чи перейменування є простим. Деякі проекти вільного програмного забезпечення використовують цю методику. Деякі очікують, що написали чудові, але важкі у використанні інструменти командного рядка (наприклад, створити образ iso cd та написати зображення на cd), експерт gui пише gui, який використовує обидва ці інструменти, в основному дозволяючи користувачеві налаштувати інструменти , налаштувати їх і стежити за ходом.
ctrl-alt-delor

Я використовував API так само просте слово, як і запитання. Насправді я повторно писав відповідь кожен раз, роблячи це для менш знайомої аудиторії з недостатнім кодом і називаючи конвенції API vs libs vs Frameworks і т. Д. Я не мав на увазі жодної образи для вас або вашої професії @richrad, ні для кого-небудь інший професійний інженер програмного забезпечення. Якщо ви хочете відредагувати щось у своєму дописі, що могло б прояснити цю проблему далі, будь ласка, продовжуйте це робити.
ismail

Образи немає, я лише уточнюю. Хороший програміст буде або не вимагатиме виклику програм командного рядка, рішення базуватиметься на складності та, можливо, (після вимірювання швидкості) на ефективності. Для невеликої групи професіоналів, які продають на ринок, може виникнути потреба зробити вашу програму складною; Викликаючи програму командного рядка, може здатися просто. Тому потрібно переписати. Якщо ви робите комісії або вільне програмне забезпечення, то ви робите найпростішу річ, яка працює.
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.