Ubuntu下从R脚本调用bash提示“gpt: not found”的问题排查
解决R中
system()调用bash时gpt: not found的问题 这问题我之前处理过!你遇到的sh: 1: gpt: not found报错,核心原因其实不是Shell切换的问题,而是R的system()函数默认使用的环境变量里,没有包含gpt命令的安装路径——你在终端里能正常运行gpt,是因为终端的PATH环境变量已经配置了它的路径,但R启动时并没有继承这个完整的PATH。
下面给你几个靠谱的解决方案:
方案1:直接使用gpt的绝对路径
最简单的办法,先在终端里用which gpt找到它的绝对路径(比如输出是/opt/snap/bin/gpt),然后把你命令里的gpt替换成这个绝对路径。修改后的命令示例:
cmd <- "/opt/snap/bin/gpt /shared/Training/Bulk_with_R/AuxData/Graph.xml -Pinput1=/shared/Training/Bulk_with_R/Original/S2A_MSIL2A_20170604T112121_N0205_R037_T29TNE_20170604T112755.SAFE/MTD_MSIL2A.xml -Ptarget1=/shared/Training/Bulk_with_R/Processing/20170604.dim" system(cmd)
这种方法不需要改环境变量,直接跳过路径查找问题,最稳妥。
方案2:在R中手动添加gpt的路径到环境变量
如果你不想每次都写长路径,可以先把gpt所在的目录添加到R的PATH里:
- 终端里运行
echo $PATH,找到包含gpt的那一段路径(比如/opt/snap/bin) - 在R中执行以下代码:
# 把找到的路径替换成你自己的 Sys.setenv(PATH = paste(Sys.getenv("PATH"), "/opt/snap/bin", sep = ":")) # 现在再执行你的命令 system(test[[1]])
这样后续的system()调用就能找到gpt了。
方案3:让R调用登录式Shell加载完整环境
如果你的gpt路径是配置在~/.bashrc或~/.profile里的,可以让R调用登录式bash,自动加载这些配置:
# 把你的命令用bash -l -c包裹 system(paste0("bash -l -c '", test[[1]], "'"))
-l参数让bash以登录Shell模式启动,会自动读取你的用户环境配置,这样就能继承终端里的PATH了。
可以先验证问题根源:在R里运行system("echo $PATH"),对比终端里的echo $PATH,就能确认是不是PATH缺失导致的问题啦。
内容的提问来源于stack exchange,提问作者GCGM
相关产品推荐
相关产品推荐

