指定在R中使用哪个shell

mad*_*ess 3 bash shell r

我必须在R里面运行一个shell脚本.我考虑过使用R的system函数.

但是,我的脚本涉及source activate/ bin/sh shell中没有的其他命令.有没有办法可以使用/ bin/bash代替?

谢谢!

Rus*_*nov 7

/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调用传递给函数systemsystem2函数的命令.