Windows 10上的WSL允许通过bash.exe执行Linux命令和命令行工具。非常有用的是,可以从Windows命令行(cmd.exe
)调用Linux工具/命令,方法是将其作为参数传递给bash.exe,如下所示:
bash.exe -c <linux command>
这非常有用,因为它应该允许基于Windows的脚本无缝地组合Windows和Linux工具。
不幸的是,我无法从R脚本调用Linux命令(见下文)。
0)系统
Win10 x64 +周年纪念更新+ WSL已安装
1)调用Linux命令的比较案例
以下所有工作对我而言;这里只显示了对ls
的示例调用。
bash -c "ls /mnt/a"
bash -c "ls /mnt/a > /mnt/a/test.txt"
如果从 WinKey + R
同样适用于.bat
文件。
可以从编译代码中调用它。我使用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);
或(32位代码):
ShellExecute (0, PChar('open'), PChar('c:\windows\sysnative\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
或(64位代码):
ShellExecute (0, PChar('open'), PChar('c:\windows\system32\bash.exe'), PChar('-c "ls /mnt/a > /mnt/a/test.txt"'), nil, SW_SHOWNORMAL);
所有这些似乎都有效(ShellExecute
返回42)。
2)无法从R 调用Linux命令 使用R 3.3.1 x64
以下所有内容(以及我尝试过的几个类似内容)都失败,状态为65535:
shell('c:/windows/system32/bash.exe -c "ls /mnt/a"', shell="cmd.exe", flag = "/c")
shell("ls", shell="c:/windows/system32/bash.exe", flag = "-c")
system('cmd /c c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')
system('bash -c "ls /mnt/a"')
system('c:/windows/system32/bash.exe -c "ls /mnt/a > /mnt/a/test.txt"')
3)问题
鉴于 1)下的示例有效,我发现 2)非常令人费解。我错过了这里明显的一切吗?
我非常感谢一个简单的例子,在WSL下通过bash.exe
运行Linux命令。
答案 0 :(得分:5)
您的失败示例现在应该在Windows 10 Insider版本&gt; = 14951中正常工作introduced many "interop" improvements and new capabilities:
> system('bash -c "ls /"')
生成:
bin cache dev home lib media opt root sbin srv tmp var
boot data etc init lib64 mnt proc run snap sys usr