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