例如,在一个程序中,它允许我选择一个文件夹并将其复制到另一个位置,最基本的层面是该应用程序运行的命令可以在终端中运行,还是使用某些内部OS API进行移动?
请饶恕我任何恶意的回应;我只是好奇,完全意识到这可以看作是一个13岁的年轻人会提出的问题。
例如,在一个程序中,它允许我选择一个文件夹并将其复制到另一个位置,最基本的层面是该应用程序运行的命令可以在终端中运行,还是使用某些内部OS API进行移动?
请饶恕我任何恶意的回应;我只是好奇,完全意识到这可以看作是一个13岁的年轻人会提出的问题。
Answers:
从概念上讲,它始终使用OS API-问题仅在于哪种方式。本质上有三种选择。
直接使用低级OS API(系统调用)。在您的示例中,任务很复杂:获取文件夹中的项目列表,检查类型(文件夹,文件...),为每个项目在目标文件夹中创建相应的项目,文件从目录中读取内容源,写入目标文件等。由于任务非常复杂,很容易出错,因此大多数应用程序都将避免这种情况。
使用简化任务的库(API)。例如,Apple Cocoa框架为NSFileManager类提供了copyItemAtPath:toPath:error使用低级OS API来完成所有肮脏工作的方法,因此应用程序不需要使用低级API本身,而是可以依靠需要较少工作的东西并且始终存在于系统中。苹果也可能会确保它运行良好。
使用外部流程执行任务。在这种情况下,外部过程将使用上述两种方法之一来完成工作。应用程序必须启动,监视它并等待完成。这样的过程很可能可以作为命令行工具运行,因此这很可能是您可以在Terminal中运行的命令。不能保证,但是很有可能。
大多数应用程序将使用选项2,因为它比1.更简单,并且比3更安全和有效。要运行外部进程,您需要正确设置它,并且无法控制它的作用。例如,很难确定出故障时到底出了什么问题,也很难知道它在做什么(例如,显示进度)。这就是为什么在大多数情况下,开发人员可能会选择选项2,但不能保证。一个值得注意的例子是使用外壳程序脚本进行自定义的应用程序,例如安装程序。
高级用户说明:您可以使用dtraceOS X的功能来查找特定应用程序在做什么。例如,您可以检查它正在产生的任何进程,这样您就可以看到它正在使用的工具(请参阅参考资料execsnoop)。
恐怕答案是“取决于情况,但通常是第二个。” 实际上,即使GUI程序正在运行终端命令,它也会通过调用API来运行它们。
仅仅是终端命令列表的程序称为Shell脚本。这样的程序可以在Mac OS X中运行,但是如果您想查看其输出,则必须在“终端”窗口中运行或启动使用GUI的程序。其他程序可以通过内部API调用命令行程序。
尽管大多数开发问题不在本站点的讨论范围之内,但实际上一个热门的示例涉及运行Automator。
在Automator中创建的程序可以调用的内部命令列表中的一个选项是调用Shell脚本或终端命令列表的能力。但这只是其内部API中可用的许多选项中的一部分。

/sbin/shutdown损坏或删除,Apple菜单中的Shutdown命令将停止工作。
应用程序可以运行CLI命令来执行某些任务,而某些实际上可以执行。但是由于效率问题,专业的应用程序开发人员避免运行该命令,而使用该命令用来执行所需任务的API。