我必须在R里面运行一个shell脚本.我考虑过使用R的system函数.
但是,我的脚本涉及source activate/ bin/sh shell中没有的其他命令.有没有办法可以使用/ bin/bash代替?
谢谢!
/bin/bash通过-c以下方式之一调用并通过选项传递命令:
system(paste("/bin/bash -c", shQuote("Bash commands")))
system2("/bin/bash", args = c("-c", shQuote("Bash commands")))
Run Code Online (Sandbox Code Playgroud)
如果您只想运行Bash 文件,请提供一个shebang,例如:
#!/bin/bash -
builtin printf %q "/tmp/a b c"
Run Code Online (Sandbox Code Playgroud)
并通过将脚本的路径传递给system函数来调用它:
system("/path/to/script.sh")
Run Code Online (Sandbox Code Playgroud)
暗示当前用户/组具有足够的权限来执行脚本.
以前我建议设置SHELL环境变量.但它可能无法工作,因为systemR中函数的实现调用具有相同名称的C函数(请参阅参考资料src/main/sysutils.c):
int R_system(const char *command)
{
/*... */
res = system(command);
Run Code Online (Sandbox Code Playgroud)
和
该
system()库函数使用fork(2)来创建子进程执行使用命令中指定的shell命令execl(3)如下:
execl("/bin/sh", "sh", "-c", command, (char *) 0);
(见man 3 system)
因此,您应该/bin/bash通过该-c选项调用并传递脚本体.
让我们列出/tmp使用Bash特定的顶级目录mapfile:
test.R
script <- '
mapfile -t dir < <(find /tmp -mindepth 1 -maxdepth 1 -type d)
for d in "${dir[@]}"
do
builtin printf "%s\n" "$d"
done > /tmp/out'
system2("/bin/bash", args = c("-c", shQuote(script)))
Run Code Online (Sandbox Code Playgroud)
test.sh
Rscript test.R && cat /tmp/out
Run Code Online (Sandbox Code Playgroud)
样本输出
/tmp/RtmpjJpuzr
/tmp/fish.ruslan
...
Run Code Online (Sandbox Code Playgroud)
尝试设置SHELL环境变量:
Sys.setenv(SHELL = "/bin/bash")
system("command")
Run Code Online (Sandbox Code Playgroud)
然后,应使用指定的shell调用传递给函数system或system2函数的命令.