Скажем, в программе, например, она позволяет мне выбрать одну папку и скопировать ее в другое место. На самом базовом уровне это приложение запускает команды, которые я могу запустить в терминале, или использует какой-то внутренний OS API для этого?
Пожалуйста, избавь меня от любых порочных ответов; Мне просто любопытно и я полностью осознаю, что это может быть воспринято как вопрос, который задает 13-летний подросток.
Ответы:
Концептуально он всегда использует OS API - вопрос только в том, каким образом. Есть по сути три варианта.
используя низкоуровневый OS API (системные вызовы) напрямую. В вашем примере задача довольно сложная: получите список элементов в папке, проверьте тип (папка, файл ...), для каждого из них создайте соответствующий элемент в целевой папке, для файлов прочитайте содержимое из исходный код, запись в целевой файл и т. д. Поскольку задача настолько сложна, легко что-то ошибиться, поэтому большинство приложений этого избегают.
использовать библиотеку (API), которая упрощает задачу. Например, инфраструктура Apple Cocoa предоставляет
NSFileManager
класс сcopyItemAtPath:toPath:error
методом, который выполняет всю грязную работу с использованием низкоуровневого API-интерфейса ОС, поэтому приложению не нужно использовать низкоуровневый API-интерфейс, а можно полагаться на то, что требует меньше работы и всегда присутствует в системе. Также Apple, вероятно, позаботится о том, чтобы все работало хорошо.использовать внешний процесс для выполнения задачи. В этом случае внешний процесс будет использовать один из двух вышеуказанных методов для выполнения работы. Приложение должно запустить такой процесс, контролировать его и ждать, пока оно не будет сделано. Вполне вероятно, что такой процесс можно запустить как инструмент командной строки, так что это, вероятно, будет команда, которую вы можете запустить в Терминале. Это не гарантировано, но очень возможно.
В большинстве приложений используется вариант 2. потому что он более простой, чем 1. и более безопасный и эффективный, чем 3. Чтобы запустить внешний процесс, необходимо правильно его настроить, и вы не можете контролировать, что он делает. Например, гораздо сложнее выяснить, что именно пошло не так в случае сбоя, и трудно понять, что он делает (например, показать прогресс). Именно поэтому в большинстве случаев разработчики, скорее всего, выберут вариант 2, но гарантии нет. Ярким примером являются приложения, использующие сценарии оболочки для настройки, такие как установщики.
Расширенное примечание пользователя: вы можете использовать
dtrace
средство OS X, чтобы узнать, что делает конкретное приложение. Например, вы можете проверить любые процессы, которые он порождает, чтобы увидеть инструменты, которые он использует (см.execsnoop
).источник
Боюсь, ответ «это зависит, но обычно второй». На самом деле, даже если программа с графическим интерфейсом пользователя выполняет команды терминала, она запускает их, вызывая API.
Программа, представляющая собой просто список команд терминала, называется сценарием оболочки. Такие программы могут работать в Mac OS X, но они должны запускаться в окне терминала или запускать программу, которая использует графический интерфейс, если вы хотите увидеть их вывод. Другие программы могут вызывать программы командной строки через внутренние API.
Хотя большинство вопросов разработки не по теме для этого сайта, один пример, который на самом деле является тематическим, включает в себя запуск Automator.
Одним из параметров в списке внутренних команд, которые может вызывать программа, созданная в Automator, является возможность вызова сценария оболочки или списка команд терминала. Но это только один из многих вариантов, доступных в его внутреннем API.
источник
/sbin/shutdown
повреждены или удалены, команда «Завершение работы» в меню Apple перестает работать.Одной из замечательных идей Unix является (было) то, что если у вас есть идея для программы, то сначала вы должны написать ее в виде сценария оболочки - по сути, вызывая серию команд.
Затем, если программа окажется полезной, вы можете улучшить ее интерфейс, попросить пользователей протестировать ее и, наконец, когда вы убедились, что она того стоит, написать «настоящую» программу.
Это, конечно, было до того, как графические пользовательские интерфейсы вступили во владение, поэтому «программа» - это сама по себе команда CLI.
Вы все еще видите этот подход в некоторых современных программах, особенно если они показывают системную информацию. Хотите создать простое приложение для отображения всех файлов в папке? Просто запустите
ls -al
, проанализируйте результат и покажите ему таблицу. Удачи с различными параметрами, и у вас есть свой материал для версии 2.0источник
Один класс программ, которые выполняют команды терминала (хотя все начинается с вызова API), - это интегрированные среды разработки программ, такие как eclipse или Xcode. Набор инструментов, необходимых для разработки программ, непомерно велик, чтобы содержаться и поддерживаться в IDE. Вместо этого он создает make-файл (разновидность скрипта) и запускает его с unix 'make' (или его эквивалентом) для выполнения процесса компиляции, компоновки, загрузки и отладки. Make, в свою очередь, запускает компилятор, компоновщик и т. Д., Используя их интерфейсы командной строки. Это позволяет среде IDE быть относительно независимой от набора инструментов, выбранного программистом, и нечувствительна к обновлениям инструментов.
источник
Приложения могут запускать команды CLI для выполнения определенной задачи, а некоторые фактически выполняют; но из-за проблем с эффективностью профессиональные разработчики приложений избегают выполнения команды и предпочитают использовать API-интерфейсы , используемые командой для выполнения требуемой задачи.
источник