我需要从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路径是正确的:
我做错了什么?
编辑:为了清楚起见,我想传递任意数量的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
。这使用shell
和intern = 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
```
答案 0 :(得分:1)
这里有两件事突出。如果找不到命令,Bash将返回退出代码127;你应该尝试运行完全限定的命令名。
我还看到你的shell正在运行/c
标志。 According to the documentation,flag
参数指定“在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
可能会满足您的需求。