如何在R中存储\$并执行包含该符号的Linux终端命令?
解决R中system命令转义错误的方案
这个错误的根源其实是R的字符串转义规则和shell的转义规则冲突了:在R里,反斜杠\是转义字符,当你写\$时,R会尝试解析这个转义序列,但R根本不认识\$这种写法,所以直接报错。我们需要让R把\$和其他特殊字符正确传递给shell,同时不触发R的转义错误。
下面给你两种可行的解决方法:
方法1:手动转义特殊字符
在R的字符串里,要传递一个反斜杠给shell,得写两个反斜杠\\(第一个用来转义第二个);如果用单引号包裹整个shell命令,里面的单引号要转成\';用双引号包裹的话,里面的双引号要转成\"。
比如用单引号包裹shell命令的写法:
system('echo "GPU0=\\$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | awk \'NR==1{print$1/100}\')" >> test.txt')
这里:
\\$会被R解析成\$,shell收到后会把$当成普通字符,不会执行命令替换,就能把$(nvidia-smi ...)原样写入文件;\'会被R解析成',保证awk命令的单引号能被shell正确识别。
或者用双引号包裹shell命令的写法:
system("echo \"GPU0=\\$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | awk 'NR==1{print$1/100}')\" >> test.txt")
方法2:用R原生字符串(推荐,R 4.0+支持)
从R 4.0版本开始,支持原生字符串语法r"(...)"——在这种字符串里,所有特殊字符(反斜杠、美元符号、单/双引号)都不需要转义,R会直接把内容原样传给shell,写法简洁又不容易出错:
system(r'(echo "GPU0=\$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | awk 'NR==1{print$1/100}')" >> test.txt)')
验证结果
执行任意一种命令后,打开test.txt就能看到你想要的脚本内容:
GPU0=$(nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits | awk 'NR==1{print$1/100}')
内容的提问来源于stack exchange,提问作者clee165
相关产品推荐
相关产品推荐

