如何处理 Unix 变体中名称相同但行为不同的实用程序?

如何处理 Unix 变体中名称相同但行为不同的实用程序?

由于某种原因,我选择 Macbook 作为我的计算机来管理远程 Linux 服务器。

有时我会遇到一些具有相同名称但在这两个操作系统之间表现不同的实用程序的问题。

例如,我很好地find ./ -name 'vim*' -exec stat -c "%y %n" {} \;查找文件并很好地显示其信息,例如:

2015-01-08 15:14:30.000000000 +0800 ./vimrc

但它在我的 OSX 上不起作用。阅读手册后,我发现我必须使用其他标志才能-f "%t%Sm %N"获得结果:

Mar  5 18:22:00 2015 ./vimrc

这种事情真的让我很烦恼。

在我看来,我认为类似 gadgets 的 Linux 版本stat更好,因为它有更多的开发者贡献,并且不断更新。大多数 OSX 用户不会使用这些小工具,他们使用 GUI。因此它的许多小工具与Linux相比都是老古董。

我真的很想将 Linux 版本的使用视为标准,并保留 OSX 版本(不要碰它们)。但我的大脑中有一个恼人的声音说这是不对的,它说“你应该面对你的问题而不是逃避它”,“全部学习”,它说。

我应该如何处理 Unix 和 Linux 中具有相同名称但行为不同的实用程序?

答案1

这不是 Unix 与 Linux 的较量,而是 BSD 与 GNU 的较量。

这两个系列均以源代码形式提供,并且可以安装在任一操作系统上。只需谷歌搜索“GNU for Mac”就可以找到几个页面,其中包含有关使用 Homebrew 或其他 Mac OSS 包管理器的说明,以将 BSD 工具替换为其 GNU 版本。

关于如何在使用两组工具时保持理智:

我所看到的大多数差异都集中在两个阵营:更多的选择和更多的解析灵活性。

“更多选项”是您在问题中提到的:GNU 工具是使用现有的 BSD 和 System V 工具作为示例创建的,因此作者有机会从头开始并添加一些额外的选项,尤其是在精美的显示选项上。其中一些对于多种工具来说是通用的。例如,许多命令接受-h-H选项来显示“人类可读单位”,例如 Kilo- Mega- Giga- 等。

解析灵活性的出现是因为大多数命令都使用该getopt库,而在 GNU 版本中,该库更加现代且功能强大。最明显的结果是,虽然大多数命令都记录为:

command [options] file file...

如果他们使用GNUgetopt库,选项可以散布在文件中。例如,在 GNU 中您可以使用:

ls -lt fileA fileB

或者

ls -l fileA -t fileB

并得到相同的结果,因为-land-t可以出现在命令行中的任何位置。在 BSD 系统中,第二种形式会给出错误,或者可能会尝试查找名为-t.

考虑到这一切,如果您发现自己处于尚未安装 GNU 工具的 MacOS 命令行中,只需记住将所有选项放在命令名称后面,并且不要期望它有太多的显示格式选项。

答案2

Unix有一个复杂的 历史。随着时间的推移,许多变体积累了许多不同的命令和选项。

大多数类 Unix 系统都有一个标准,或者更确切地说是一个标准层次结构:POSIX,以及 POSIX+XSI(以前称为单一Unix— Single Unix 现在是 POSIX,其中 XSI 部分标记为可选)。你可以依赖任何类似 Unix 的东西,而不是古董或嵌入式实现POSIX-2004 又名 Single Unix v3 又名 Open Group 基本规范第 6 期;即使在今天,较新的版本(POSIX-2008 = SUSv4 = Issue 7)也没有得到完全支持。

如果您只对 OSX(和 FreeBSD,这是大多数 OSX 实用程序的来源)和非嵌入式 Linux 感兴趣,您可以依靠更多的命令和选项:两者都具有比平均水平更多的功能。您需要查看手册以了解两种操作系统都支持什么。

非嵌入式 Linux 系统(以及一些更高端的嵌入式 Linux 系统)以及 Cygwin 都附带GNU公用事业。 GNU 实用程序通常比其他竞争对手具有更多方便的功能。

stat命令是一个示例,其中 POSIX 没有任何说明,OSX 有一定的语法,GNU 有类似的功能但具有不同的语法。

您可以在大多数 Unix 变体上安装 GNU 实用程序。对于 OSX,请参阅https://apple.stackexchange.com/questions/69223/how-to-replace-mac-os-x-utilities-with-gnu-core-utilities

是否坚持通用核心或在各处安装相同版本是个人决定。如果您可以控制您使用的所有机器,只需确保它们都具有您想要的所有实用程序即可。如果你编写的代码运行在你并不总是能够安装你想要的所有东西的机器上,那么你需要坚持使用可移植的东西。

相关内容