程序以最简单的形式运行终端命令吗?


18

例如,在一个程序中,它允许我选择一个文件夹并将其复制到另一个位置,最基本的层面是该应用程序运行的命令可以在终端中运行,还是使用某些内部OS API进行移动?

请饶恕我任何恶意的回应;我只是好奇,完全意识到这可以看作是一个13岁的年轻人会提出的问题。


4
欢迎询问不同!有些问题比其他问题更高级,这没关系;您无需道歉。如果您对Apple硬件,Apple软件,其他Apple产品或服务,Apple产品的第三方硬件和软件有疑问,而又不是FAQ中禁止的主题,那么您来对地方了!因此,如果您的问题是热门话题,即使您 13岁(但根据服务条款,年龄不小于年轻人),也欢迎在这里提出。
丹尼尔

3
好问题-至少有三个非平凡的答案。我希望这能得到一个基本的答案,一个中间的答案,以及一个“约翰·西拉库萨(John Siracusa)剖析Mac OS X应用程序二进制结构的内部工作原理”的答案,以便您可以选择并从中学习。
bmike

Answers:


11

从概念上讲,它始终使用OS API-问题仅在于哪种方式。本质上有三种选择。

  1. 直接使用低级OS API(系统调用)。在您的示例中,任务很复杂:获取文件夹中的项目列表,检查类型(文件夹,文件...),为每个项目在目标文件夹中创建相应的项目,文件从目录中读取内容源,写入目标文件等。由于任务非常复杂,很容易出错,因此大多数应用程序都将避免这种情况。

  2. 使用简化任务的库(API)。例如,Apple Cocoa框架为NSFileManager类提供了copyItemAtPath:toPath:error使用低级OS API来完成所有肮脏工作的方法,因此应用程序不需要使用低级API本身,而是可以依靠需要较少工作的东西并且始终存在于系统中。苹果也可能会确保它运行良好。

  3. 使用外部流程执行任务。在这种情况下,外部过程将使用上述两种方法之一来完成工作。应用程序必须启动,监视它并等待完成。这样的过程很可能可以作为命令行工具运行,因此这很可能是您可以在Terminal中运行的命令。不能保证,但是很有可能。

大多数应用程序将使用选项2,因为它比1.更简单,并且比3更安全和有效。要运行外部进程,您需要正确设置它,并且无法控制它的作用。例如,很难确定出故障时到底出了什么问题,也很难知道它在做什么(例如,显示进度)。这就是为什么在大多数情况下,开发人员可能会选择选项2,但不能保证。一个值得注意的例子是使用外壳程序脚本进行自定义的应用程序,例如安装程序。

高级用户说明:您可以使用dtraceOS X的功能来查找特定应用程序在做什么。例如,您可以检查它正在产生的任何进程,这样您就可以看到它正在使用的工具(请参阅参考资料execsnoop)。


4

恐怕答案是“取决于情况,但通常是第二个。” 实际上,即使GUI程序正在运行终端命令,它也会通过调用API来运行它们。

仅仅是终端命令列表的程序称为Shell脚本。这样的程序可以在Mac OS X中运行,但是如果您想查看其输出,则必须在“终端”窗口中运行或启动使用GUI的程序。其他程序可以通过内部API调用命令行程序。

尽管大多数开发问题不在本站点的讨论范围之内,但实际上一个热门的示例涉及运行Automator。

在Automator中创建的程序可以调用的内部命令列表中的一个选项是调用Shell脚本或终端命令列表的能力。但这只是其内部API中可用的许多选项中的一部分。

在此处输入图片说明


但是有时,这些API最终会调用您可以从Terminal访问的命令。我读过一些报告(我不介意在自己的计算机上进行复制,非常感谢),如果/sbin/shutdown损坏或删除,Apple菜单中的Shutdown命令将停止工作。
丹尼尔

1
Shell脚本不必在终端窗口或任何其他软窗口中运行。但是,如果它们产生的输出未重定向到文件,则可以选择在窗口中运行它。Shell脚本也可以运行带有Windows的其他程序。
ctrl-alt-delor 2012年

@理查德绝对正确。编辑。
丹尼尔

2

Unix背后的一个好主意是(如果)对程序有一个主意,那么您首先将其编写为Shell脚本-本质上就是调用一系列命令。

然后,如果该程序被证明是有用的,则可以改进其界面,让用户对其进行测试,最后,当您确信它是值得的时,编写一个“真实的”程序。

当然,这是在图形用户界面接管之前,因此这里的“程序”本身就是CLI命令。

您仍会在某些现代程序中看到这种方法,尤其是当它们显示系统信息时。是否要构建一个简单的应用程序以列出文件夹中的所有文件?只需运行ls -al,分析结果并显示一个表即可。有趣的使用各种参数,就可以拥有2.0版的资料


1

一类运行终端命令的程序(即使它们都以API调用开头)是集成的程序开发环境,例如eclipse或Xcode。程序开发所需的工具集合非常庞大,无法包含在IDE中并为IDE维护。相反,它将构建一个makefile(一种脚本),并使用unix“ make”(或等效版本)运行该文件,以逐步完成编译,链接,加载和调试过程。依次使用它们的命令行界面运行编译器,链接器等。这使IDE相对独立于程序员选择的工具集,并且对工具的更新不敏感。


1

应用程序可以运行CLI命令来执行某些任务,而某些实际上可以执行。但是由于效率问题,专业的应用程序开发人员避免运行该命令,而使用该命令用来执行所需任务的API


我是专业的软件工程师。我从程序中调用命令。我什至会自己写一些或全部,然后用另一种语言写gui。但是,我不会使用cp(复制)或mv(移动/重命名)命令,因为要复制或重命名的api很简单。一些自由软件项目使用此技术。一些期望者编写了出色但难于使用的命令行工具(例如,创建iso cd映像,以及将映像写入cd),gui专家编写了同时使用这两种工具的gui,基本上允许用户配置工具,让他们继续前进并监控进度。
ctrl-alt-delor

我使用API就像问题使用的简单单词一样。实际上,我每次都多次重写答案,以使底层的代码和API vs libs vs Frameworks等命名约定对不太熟悉的听众有所帮助。我的意思是对您或您的专业@richrad均不冒犯,其他专业软件工程师。如果您想在我的帖子中进行某些修改,以进一步澄清问题,请继续进行。
ismail 2012年

我只是在澄清,没有冒犯。一个好的程序员会或不会调用命令行程序,这个决定将基于复杂性,并可能基于效率(在测量速度之后)。对于向市场出售产品的一小撮专业人士,可能需要使您的计划复杂化;调用命令行程序似乎很简单。因此,需要重写。如果您执行佣金或免费软件,那么您将执行最简单的工作。
ctrl-alt-delor 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.