gpt4 book ai didi

r - system() 返回错误但 shell() 有效

转载 作者:可可西里 更新时间:2023-11-01 11:16:21 24 4
gpt4 key购买 nike

我最近完成了 (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() 应该是 system() 的简单用户友好包装器。因此,我不明白为什么 shell() 有效,但系统却没有。

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

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

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

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

最佳答案

首先我尝试了是否可以重现这个(在 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 上)。

关于r - system() 返回错误但 shell() 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41807981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com