来自R的UNIX命令通过shell函数

时间:2018-02-27 18:46:03

标签: r bash rstudio knitr git-bash

我需要从R会话发出unix命令。我在使用RStudio 1.1.383和R 3.4.3的Windows R2 2012服务器上。

shell()函数看起来对我来说是正确的,但当我指定bash shell的路径时(从Git for Windows install),命令失败,错误代码为127。

shell_path <- "C:\\Program Files\\Git\\git-bash.exe"
shell("ls -a", shell = shell_path)
## running command 'C:\Program Files\Git\git-bash.exe /c ls -a' had status 127'ls -a' execution failed with error code 127

非常确定我的shell路径是正确的:

enter image description here

我做错了什么?

编辑:为了清楚起见,我想传递任意数量的UNIX命令,我只是使用ls -a作为示例。

编辑:

在2018-03-09之后玩了一些游戏:

shell(cmd = "ls -a", shell = '"C:/Program Files/Git/bin/bash.exe"', intern = TRUE, flag = "-c")

我的bash.exe的正确位置是.../bin/bash.exe。这使用shellintern = TRUE将输出作为R对象返回。请注意在shell路径周围使用单引号。

编辑:2018-03-09 21:40:46 UT

在RStudio中,我们也可以使用knitr调用bash并设置块选项:

library(knitr)

```{bash my_bash_chunk, engine.path="C:\\Program Files\\Git\\bin\\bash.exe"}
# Using a call to unix shell
ls -a
```

3 个答案:

答案 0 :(得分:1)

这里有两件事突出。如果找不到命令,Bash将返回退出代码127;你应该尝试运行完全限定的命令名。

我还看到你的shell正在运行/c标志。 According to the documentationflag参数指定“在shell下运行命令的开关”,它默认为/c,但“如果shell是bash或tcsh或sh,则默认值已更改到'-c'。“显然git-bash.exe没有发生这种情况。

尝试以下更改:

shell_path <- "C:\\Program Files\\Git\\git-bash.exe"
shell("/bin/ls -a", shell = shell_path, flag = "-c")

不在Windows上,因此无法确定这是否有效。

答案 1 :(得分:0)

也许您需要使用shQuote

shell( paste("ls -a  ", shQuote( shell_path) ) )

(未经测试。我不在Windows上。但请阅读?shQuote))

答案 2 :(得分:0)

如果您只想ls -a,可以使用以下命令:

shell("'ls -a'", shell="C:\\Git\\bin\\sh.exe")

#or
shell('C:\\Git\\bin\\sh.exe -c "ls -a"')

让我们知道&#34; Program Files&#34;造成了问题。

如果您需要登录才能调用命令,

shell('C:\\Git\\bin\\sh.exe --login -c "ls -a"')

但如果您正在考虑从R执行git命令,那么git2r可能会满足您的需求。