
我编写了一个 R 包,其中包含一个运行“grep”系统命令的函数。此包已在 CRAN 上发布,Solaris 平台上的测试返回错误。这可能是由于 Solaris 上“grep”的用法不同。以下是该包运行的命令示例:
grep --include=\*\.txt --colour=always -n -r -e 'PATTERN'
此命令递归搜索当前文件夹及其子文件夹等中找到的所有“txt”文件中的模式“PATTERN”(递归搜索)。
我没有此命令生成的错误消息,我只知道发生了错误。在 Solaris 上与此等效的命令是什么?
答案1
我认为这个问题的核心与POSIX兼容性有关。grep
是 POSIX 标准指定的工具。正如 schily 在评论中指出的那样, 的 POSIX 规范grep
不包括--include
或--colour
选项。事实上,这些选项是 GNU 的一部分,它在 POSIX 规范规定的功能之外grep
添加了更多功能。 grep
GNUgrep
手册可以在这里找到:https://www.gnu.org/software/grep/manual/grep.html
在 Solaris 上,默认grep
工具是 Sun/Oracle 提供的另一个 POSIX 兼容实现。当然,该实现不支持此处所需的任何选项。可以找到 Solaris 10 的联机帮助页这里,Solaris 11 的可以找到这里。
此限制超出了grep
Solaris 上的命令。例如,date
Solaris 上的命令与 GNU 相比就不太灵活date
。 Solaris 10 上的命令ps
还将进程命令行截断为 80 个字符。作为这些问题的解决方案/变通方法,GNU 工具最终在 Solaris 10 和 11 上可用。本次质量检查更详细地介绍了在哪里可以找到它们以及如何安装它们。
当 GNU 工具安装在 Solaris 系统上并且该工具的名称已被使用时,ag
将作为命令名称的前缀。因此,date
成为gdate
、grep
成为ggrep
等等。在您的情况下,可以使用该命令解决问题,ggrep
因为它支持所需的 GNU 特定选项(或扩展)。
这里可能存在的问题是 Solaris 系统不需要安装 GNU 工具。安装这些软件包需要一些额外的工作。如果目标上不存在 GNU 工具,则该ggrep
命令将不可用。
一般来说,旨在实现跨 POSIX 发行版可移植性的解决方案采用相反的方法。该解决方案没有使用特定于每个平台的工具,而是有意修改为遵守 POSIX 规范,并且不使用特定于任何特定实现的任何扩展。这通常是确保解决方案在所有 POSIX 兼容系统上一致工作的唯一方法。