system() 返回错误,但 shell() 有效

tak*_*kje 4 windows r

我最近完成了(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"
Run Code Online (Sandbox Code Playgroud)

文档描述 shell() 应该是 system() 的一个简单的用户友好的包装器。因此我不明白为什么 shell() 可以工作,但系统却不能。

在另一台 system() 函数仍然可以工作的计算机上,我检查了差异。Windows 版本、R 版本和软件包版本是相同的(至少根据干净会话中的 sessionInfo() 是相同的)。与我可以使用的 system() 相比,Shell() 指定了一些额外的参数:

  • shell指定要使用的 shell。“详细信息”部分告诉我,这将检查两个环境变量:R_SHELL 和 COMSPEC。R_SHELL 未在两个系统(全局和本地)上定义。COMSPEC 已定义,并在两个系统上引用 cmd.exe(位于同一文件夹中)。我已经检查并通过此可执行文件运行纯命令。
  • flag不知道这是做什么的,但它与 system() 命令不同。据我了解,更改它的唯一原因是使用不同的 shell/操作系统(例如 Linux 上的 Bash)。
  • shell() 和 system() 的intern设置为 FALSE。
  • shell() 和 system() 的wait设置为 TRUE。
  • translate设置为 TRUE,但系统调用不包含“/”或“\”。正如预期的那样,使用这个布尔值不会改变结果。
  • 发生错误时必须处理与输出相关的工作。将返回错误或警告。更改此布尔值不会改变行为。

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

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

Rol*_*and 5

首先我尝试是否可以重现此问题(在 Win10 上):

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

shell('ECHO "test"')
#"test"
Run Code Online (Sandbox Code Playgroud)

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

system('C:\\WINDOWS\\system32\\cmd.exe /c ECHO "test"')
#"test"
Run Code Online (Sandbox Code Playgroud)

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

  • 真正让我困惑的是它确实可以在另一台计算机上运行。显然,该计算机有 echo.exe,它的功能与它所说的完全一样(通过 Rtools 安装并自动添加到路径中)。因此我没有意识到系统不通过外壳程序(cmd)传递。 (2认同)