如何在 Linux (WSL) 的 Windows 子系统下通过 bash 从 R 执行 linux 命令?
How to execute linux commands from R via bash under the Windows Subsystem for Linux (WSL)?
Windows 10 上的 WSL 允许通过 bash.exe 执行 Linux 命令和命令行工具。非常有用的是,可以从 Windows 命令行 (cmd.exe
) 调用 Linux tool/command,方法是将其作为参数传递给 bash.exe,如下所示:
bash.exe -c <linux command>
这非常有用,因为它应该允许基于 Windows 的脚本无缝地结合 Windows 和 Linux 工具。
不幸的是,我未能从 R 脚本调用 Linux 命令(见下文)。
0) 系统
Win10 x64 + 周年更新 + 安装 WSL
1) 调用Linux命令的比较案例
以下都适合我;此处仅显示了对 ls
.
的示例调用
来自 windows 命令行(cmd.exe 提示符)
bash -c "ls /mnt/a"
bash -c "ls /mnt/a > /mnt/a/test.txt"
如果从 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);
或(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
returns 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) 非常令人费解。我在这里遗漏了什么明显的东西吗?
我将非常感谢一个简单的示例,其中 运行 通过 bash.exe
在 WSL 下运行的 Linux 命令。
您的失败示例现在应该可以在 Windows 10 Insider builds >= 14951 which 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
Windows 10 上的 WSL 允许通过 bash.exe 执行 Linux 命令和命令行工具。非常有用的是,可以从 Windows 命令行 (cmd.exe
) 调用 Linux tool/command,方法是将其作为参数传递给 bash.exe,如下所示:
bash.exe -c <linux command>
这非常有用,因为它应该允许基于 Windows 的脚本无缝地结合 Windows 和 Linux 工具。
不幸的是,我未能从 R 脚本调用 Linux 命令(见下文)。
0) 系统
Win10 x64 + 周年更新 + 安装 WSL
1) 调用Linux命令的比较案例
以下都适合我;此处仅显示了对 ls
.
来自 windows 命令行(cmd.exe 提示符)
bash -c "ls /mnt/a"
bash -c "ls /mnt/a > /mnt/a/test.txt"
如果从 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);
或(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
returns 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) 非常令人费解。我在这里遗漏了什么明显的东西吗?
我将非常感谢一个简单的示例,其中 运行 通过 bash.exe
在 WSL 下运行的 Linux 命令。
您的失败示例现在应该可以在 Windows 10 Insider builds >= 14951 which 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