【问题标题】:system() returns error but shell() workssystem() 返回错误但 shell() 有效
【发布时间】:2017-01-23 13:52:49
【问题描述】:

我最近完成了 (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 版本和包版本是相等的(至少根据干净会话中的 sessionInfo() )。与我可以使用的 system() 相比,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,但系统调用不包含“/”或“\”。正如预期的那样,使用此布尔值不会改变结果。
  • mustWork 与发生错误时的输出相关。将返回错误或警告。更改此布尔值不会改变行为。

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

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

【问题讨论】:

    标签: r windows


    【解决方案1】:

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

    【讨论】:

    • 真正让我困惑的是它确实可以在另一台计算机上运行。显然,那台计算机有 echo.exe,它完全按照它所说的(通过 Rtools 安装并自动添加到路径中)。因此我没有意识到系统不通过shell(cmd)。
    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多