system()返回错误,但shell()工作

时间:2017-01-23 13:52:49

标签: r windows

我最近完成了(Windows)系统更新,现在我不能再使用R运行系统命令。我已经尝试重新安装R和所有使用过的软件包,但这并没有解决我的问题。问题。重新启动也没有解决问题。

我刚刚发现虽然system()和system2()命令不再起作用,但shell()命令确实有效。

> system('ECHO "test"')
Warning message:
running command 'ECHO "test"' had status 127
> system2('ECHO "test"')
Warning message:
running command 'ECHO \"test\"' had status 127
> shell('ECHO "test"')
"test"

文档描述了shell()应该是一个简单的用户友好的系统()包装器。因此,我不明白为什么shell()有效,但系统没有。

使用另一台系统()功能仍然有效的计算机,我已检查过差异。 Windows版本,R版本和软件包版本相同(至少根据干净会话中的sessionInfo())。与我可以使用的system()相比,Shell()指定了一些额外的参数:

  • shell 指定要使用的shell。 '细节'部分告诉我这将检查两个环境变量:R_SHELL和COMSPEC。 R_SHELL未在两个系统(全局和本地)上定义。 COMSPEC已定义并在两个系统上引用cmd.exe(在同一文件夹中)。我通过这个可执行文件检查并运行了pure命令。
  • 标记不知道这是什么,但它与system()命令有所不同。据我了解,改变它的唯一原因是使用不同的shell / OS(例如Linux上的Bash)。
  • 对于shell()和system(),
  • 实习生设置为FALSE。
  • 对于shell()和system(),
  • 等待设置为TRUE。
  • 翻译设置为TRUE,但系统调用不包含' /'也不是'正如预期的那样,使用此布尔值不会改变结果。
  • 如果出现错误,
  • mustWork 与输出相关。将返回错误或警告。更改此布尔值不会改变行为。

因此,我只能得出结论,shell()在system()之上做某事,以某种方式改变它的行为。此行为未在文档中指定,也不能通过任何参数访问。

在哪里可以找到两者之间的其他差异,以找到此错误的来源?

1 个答案:

答案 0 :(得分:4)

首先我试过,如果我可以重现这个(在Win10上):

system('ECHO "test"')
#Warning message:
#running command 'ECHO "test"' had status 127

shell('ECHO "test"')
#"test"

然后我查看了shell的源代码,发现它在将命令传递给system之前更改了命令。在我的系统上:

system('C:\\WINDOWS\\system32\\cmd.exe /c ECHO "test"')
#"test"

另请参阅Sys.getenv("COMSPEC"),如果Sys.getenv("R_SHELL")为空,则会给出shell。请注意,文档指出POSIX标准要求在shell下运行命令。 help("system")解释说,在类似Unix的操作系统system上启动shell并推荐shell(在Windows上)。