如何在R中调用bash,在Ubuntu虚拟机其他目录执行make命令
Ubuntu下通过R调用bash执行其他目录make命令的方法
R内置了system()和system2()两个函数可以直接调用bash命令,以下是两种常用的实现方式:
方法1:使用make自带的-C参数指定目录(推荐)
make命令的-C参数可以直接指定要执行makefile的目录,不会修改R当前的工作目录,是最稳妥的方案,示例代码如下:
# 替换为你存放makefile的目标目录路径 make_dir <- "/home/your_name/projects/python_script_dir" # 执行默认make目标 system(paste0("make -C ", shQuote(make_dir))) # 执行指定make目标,比如clean、build等 system(paste0("make -C ", shQuote(make_dir), " build"))
这里的
shQuote()函数会自动对路径进行转义,避免路径中存在空格、特殊字符时bash解析出错。
方法2:组合cd与make命令
如果需要在目标目录执行多个关联命令,可以先切换到目标目录再执行make:
make_dir <- "/home/your_name/projects/python_script_dir" # &&表示只有cd执行成功才会运行后面的make命令,避免在错误目录执行操作 system(paste0("cd ", shQuote(make_dir), " && make"))
常见问题排查
- 运行前可先在R中执行
system("which make")确认系统已安装make,若返回空值,可先在Ubuntu终端执行sudo apt install make完成安装。 - 若需要捕获命令执行的输出/报错信息用于排查,可以使用更灵活的
system2()函数,示例如下:
make_dir <- "/home/your_name/projects/python_script_dir" exec_res <- system2( command = "make", args = c("-C", shQuote(make_dir), "all"), stdout = TRUE, stderr = TRUE ) # 打印完整执行日志 print(exec_res)
- 不要直接在调用的make命令前加sudo,会因为需要输入密码导致进程卡住,若确实需要管理员权限,可提前将对应make操作加入sudoers免密列表。
内容的提问来源于stack exchange,提问作者Angus Campbell
相关产品推荐
相关产品推荐

