В простейшем виде программы просто запускают команды терминала?

18

Скажем, в программе, например, она позволяет мне выбрать одну папку и скопировать ее в другое место. На самом базовом уровне это приложение запускает команды, которые я могу запустить в терминале, или использует какой-то внутренний OS API для этого?

Пожалуйста, избавь меня от любых порочных ответов; Мне просто любопытно и я полностью осознаю, что это может быть воспринято как вопрос, который задает 13-летний подросток.

azz0r
источник
4
Добро пожаловать, чтобы спросить другого! Некоторые вопросы более продвинуты, чем другие, и это нормально; вам не нужно извиняться Если у вас есть вопрос об оборудовании Apple, программном обеспечении Apple, других продуктах или услугах Apple, стороннем оборудовании и программном обеспечении для продуктов Apple, и речь идет не о темах, запрещенных в FAQ, тогда вы находитесь в правильном месте, чтобы задать свой вопрос. ! Так что, если ваш вопрос по теме, это приветствовать здесь, даже если вы находитесь в 13-летний (но не моложе, согласно условиям службы ).
Даниил
3
Отличный вопрос - есть как минимум три нетривиальных уровня ответов на этот вопрос. Я надеюсь, что он получит базовый, средний ответ и ответ уровня «Джон Сиракуза рассекает внутреннюю работу двоичной структуры приложения Mac OS X», чтобы вы могли выбирать и учиться у всех.
bmike

Ответы:

11

Концептуально он всегда использует OS API - вопрос только в том, каким образом. Есть по сути три варианта.

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

  2. использовать библиотеку (API), которая упрощает задачу. Например, инфраструктура Apple Cocoa предоставляет NSFileManagerкласс с copyItemAtPath:toPath:errorметодом, который выполняет всю грязную работу с использованием низкоуровневого API-интерфейса ОС, поэтому приложению не нужно использовать низкоуровневый API-интерфейс, а можно полагаться на то, что требует меньше работы и всегда присутствует в системе. Также Apple, вероятно, позаботится о том, чтобы все работало хорошо.

  3. использовать внешний процесс для выполнения задачи. В этом случае внешний процесс будет использовать один из двух вышеуказанных методов для выполнения работы. Приложение должно запустить такой процесс, контролировать его и ждать, пока оно не будет сделано. Вполне вероятно, что такой процесс можно запустить как инструмент командной строки, так что это, вероятно, будет команда, которую вы можете запустить в Терминале. Это не гарантировано, но очень возможно.

В большинстве приложений используется вариант 2. потому что он более простой, чем 1. и более безопасный и эффективный, чем 3. Чтобы запустить внешний процесс, необходимо правильно его настроить, и вы не можете контролировать, что он делает. Например, гораздо сложнее выяснить, что именно пошло не так в случае сбоя, и трудно понять, что он делает (например, показать прогресс). Именно поэтому в большинстве случаев разработчики, скорее всего, выберут вариант 2, но гарантии нет. Ярким примером являются приложения, использующие сценарии оболочки для настройки, такие как установщики.

Расширенное примечание пользователя: вы можете использовать dtraceсредство OS X, чтобы узнать, что делает конкретное приложение. Например, вы можете проверить любые процессы, которые он порождает, чтобы увидеть инструменты, которые он использует (см. execsnoop).

Саймон Урбанек
источник
4

Боюсь, ответ «это зависит, но обычно второй». На самом деле, даже если программа с графическим интерфейсом пользователя выполняет команды терминала, она запускает их, вызывая API.

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

Хотя большинство вопросов разработки не по теме для этого сайта, один пример, который на самом деле является тематическим, включает в себя запуск Automator.

Одним из параметров в списке внутренних команд, которые может вызывать программа, созданная в Automator, является возможность вызова сценария оболочки или списка команд терминала. Но это только один из многих вариантов, доступных в его внутреннем API.

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

Даниэль
источник
Но иногда API в конечном итоге вызывают команды, к которым вы можете получить доступ из Терминала. Я прочитал отчеты (ничего, что я хотел бы воспроизвести на моем собственном компьютере, большое спасибо), что, если они /sbin/shutdownповреждены или удалены, команда «Завершение работы» в меню Apple перестает работать.
Даниил
1
Скрипты оболочки не должны запускаться в окне терминала или любом другом программном окне. Но если они производят вывод, который не перенаправлен в файл, вы можете запустить его в окне. Сценарии оболочки также могут запускать другие программы с окнами.
Ctrl-Alt-Delor
@ Ричард Абсолютно верно. Ред.
Даниэль
2

Одной из замечательных идей Unix является (было) то, что если у вас есть идея для программы, то сначала вы должны написать ее в виде сценария оболочки - по сути, вызывая серию команд.

Затем, если программа окажется полезной, вы можете улучшить ее интерфейс, попросить пользователей протестировать ее и, наконец, когда вы убедились, что она того стоит, написать «настоящую» программу.

Это, конечно, было до того, как графические пользовательские интерфейсы вступили во владение, поэтому «программа» - это сама по себе команда CLI.

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

Monolo
источник
1

Один класс программ, которые выполняют команды терминала (хотя все начинается с вызова API), - это интегрированные среды разработки программ, такие как eclipse или Xcode. Набор инструментов, необходимых для разработки программ, непомерно велик, чтобы содержаться и поддерживаться в IDE. Вместо этого он создает make-файл (разновидность скрипта) и запускает его с unix 'make' (или его эквивалентом) для выполнения процесса компиляции, компоновки, загрузки и отладки. Make, в свою очередь, запускает компилятор, компоновщик и т. Д., Используя их интерфейсы командной строки. Это позволяет среде IDE быть относительно независимой от набора инструментов, выбранного программистом, и нечувствительна к обновлениям инструментов.

JRobert
источник
1

Приложения могут запускать команды CLI для выполнения определенной задачи, а некоторые фактически выполняют; но из-за проблем с эффективностью профессиональные разработчики приложений избегают выполнения команды и предпочитают использовать API-интерфейсы , используемые командой для выполнения требуемой задачи.

исмаил
источник
Я профессиональный инженер-программист. Я вызываю команды из моих программ. Я даже сам напишу некоторые или все из них, а затем напишу графический интерфейс на другом языке. Однако я бы не использовал команды cp (copy) или mv (move / rename), поскольку api для копирования или переименования прост. Некоторые проекты свободных программ используют эту технику. Некоторые ожидают, что написали превосходные, но сложные в использовании инструменты командной строки (например, для создания образа iso cd и для записи образа на cd), эксперт gui пишет графический интерфейс, который использует оба этих инструмента, в основном позволяя пользователю настраивать инструменты , чтобы заставить их работать, и следить за прогрессом.
Ctrl-Alt-Delor
Я использовал API как простое слово, которое использовал вопрос. На самом деле, я переписывал ответ несколько раз каждый раз, делая его для менее знакомой аудитории с нижележащим кодом и соглашениями по присвоению имен API vs libs v Frameworks и т. Д. Я не хотел никого обидеть ни вас, ни вашу профессию @richrad, ни кого-либо другой профессиональный инженер-программист. Если есть что-то, что вы хотите отредактировать в моем посте, что бы прояснить этот вопрос дальше, пожалуйста, сделайте это.
Исмаил
Нет обид, я просто уточняю. Хороший программист будет или не будет вызывать программы командной строки, решение будет основываться на сложности и, возможно, (после измерения скорости) на эффективности. Для небольшой группы профессионалов, которые продают на рынке, может возникнуть необходимость сделать вашу программу сложной; Вызов программы из командной строки может показаться простым. Поэтому необходимо переписать. Если вы делаете комиссионные или свободное программное обеспечение, вы делаете самое простое, что работает.
Ctrl-Alt-Delor