在R中使用system执行连续Bash指令失败,无法获取目标文件夹文件
R中system函数执行连续Bash指令的状态保留问题
你用R的system()函数执行连续Bash命令时碰到了两个问题:
- 每条
cd命令返回状态码127,执行失败 - 后续的
dir命令始终显示R项目根目录的内容,cd的目录切换状态根本没保留
问题原因
- 子shell独立运行:每个
system()调用都会启动一个单独的子shell进程,进程结束后,它的环境状态(比如当前工作目录)不会传递给下一个system()调用,所以连续的cd指令根本没法叠加切换目录的效果。 - 命令找不到导致127错误:如果是Windows环境,
cd是cmd的内置命令,不是独立的可执行文件,直接用system("cd ..")会因为找不到cd.exe报错;就算是Linux/macOS,cd作为shell内置命令,单独执行也不会改变R主进程的工作目录,子shell跑完就没了,状态码异常也很正常。
解决办法
方法1:把多条命令放到同一个system调用里
让所有需要连续执行的命令在同一个子shell中运行,用&&或分号连接:
# Windows环境用cmd命令 system(command = paste("cd", path2, "&& dir")) # Linux/macOS环境用bash命令 system(command = paste("cd", path2, "&& ls"))
这样目录切换后,dir/ls就能直接显示目标目录的内容。
方法2:用R内置函数更省心
R本身就有操作目录和文件的内置函数,完全不用调用外部shell:
- 切换目录:
setwd(path2) - 获取文件列表:
list.files(path2)或者dir(path2)
示例代码:
# 切换到目标目录 setwd(path2) # 获取当前目录下的所有文件 file_list <- list.files() # 打印文件列表 print(file_list)
这种方法跨平台,还能直接在R进程里保留工作目录状态,比调用shell命令靠谱多了。
内容的提问来源于stack exchange,提问作者Aimé Jean
相关产品推荐
相关产品推荐

