如何在Windows的Linux子系统(WSL)下通过bash从R执行linux命令?

Phi*_*hiS 9 windows delphi r windows-subsystem-for-linux

Windows 10上的WSL允许通过bash.exe执行Linux命令和命令行工具.非常有用的是,可以从Windows命令行(cmd.exe)调用Linux工具/命令,方法是将其作为参数传递给bash.exe,如下所示:

bash.exe -c <linux command>
Run Code Online (Sandbox Code Playgroud)

这非常有用,因为它应该允许基于Windows的脚本无缝地组合Windows和Linux工具.

不幸的是,我无法从R脚本调用Linux命令(见下文).

0)系统

安装了Win10 x64 +周年纪念更新+ WSL

1)调用Linux命令的比较情况

以下一切都适合我; 这里显示的只是一个示例调用ls.

  • 从Windows命令行(cmd.exe提示符)

    bash -c "ls /mnt/a"
    
    Run Code Online (Sandbox Code Playgroud)

    bash -c "ls /mnt/a > /mnt/a/test.txt"
    
    Run Code Online (Sandbox Code Playgroud)
  • 同样的工作,如果从...开始 WinKey + R

  • 同样可以在.bat文件中使用.

  • 它可以从编译的代码中调用.我尝试使用Delphi XE2 32位和64位使用ShellExecute:

    例如,这些工作(32位和64位):

    ShellExecute (0, PChar('open'), PChar('cmd.exe'), PChar('/c c:\windows\system32\bash.exe -c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
    
    Run Code Online (Sandbox Code Playgroud)

    或(32位代码):

    ShellExecute (0, PChar('open'), PChar('c:\windows\sysnative\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
    
    Run Code Online (Sandbox Code Playgroud)

    或(64位代码):

    ShellExecute (0, PChar('open'), PChar('c:\windows\system32\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
    
    Run Code Online (Sandbox Code Playgroud)

    所有这些似乎都有效(并ShellExecute返回42).

2)无法 使用R 3.3.1 x64 从R调用Linux命令

下面的所有内容(以及我尝试过的几个类似的东西)都失败了,状态为65535:

shell('c:/windows/system32/bash.exe -c "ls /mnt/a"', shell="cmd.exe", flag = "/c")
Run Code Online (Sandbox Code Playgroud)

shell("ls", shell="c:/windows/system32/bash.exe", flag = "-c")
Run Code Online (Sandbox Code Playgroud)

system('cmd /c c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')
Run Code Online (Sandbox Code Playgroud)

system('bash -c "ls /mnt/a"')
Run Code Online (Sandbox Code Playgroud)

system('c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')
Run Code Online (Sandbox Code Playgroud)

3)问题

鉴于下例1)工作,我觉得2)很令人费解.我错过了这里明显的一切吗?

我将非常感谢一个简单的例子,bash.exe在WSL下运行Linux命令.

Ric*_*ner 5

您的失败示例现在应该在Windows 10 Insider版本> = 14951中正常工作,它引入了许多"互操作"改进和新功能:

> system('bash -c "ls /"')
Run Code Online (Sandbox Code Playgroud)

产生:

bin   cache  dev  home  lib    media  opt   root  sbin  srv  tmp  var
boot  data   etc  init  lib64  mnt    proc  run   snap  sys  usr
Run Code Online (Sandbox Code Playgroud)