如何优雅实现命令执行结果与命令本身同存至文本文件?
解决命令输出文件包含命令本身的优化方案
我明白你想要的效果:执行命令后,生成的文本文件里先显示命令本身,接着空几行,再放命令的输出,这样别人看文件时能直接用命令刷新内容。原来的命令确实有点繁琐,咱们来一步步优化,或者解决符号替换的问题。
最优方案:用Shell函数自动处理(解决两个痛点)
咱们可以写一个简单的Shell函数,这样既不用手动重复输入命令,也不用处理转义的麻烦。把下面这段代码加到你的~/.bashrc或者~/.zshrc里,或者直接在终端里运行:
cmd2file() { # 把所有传入的参数当作完整命令,最后一个参数是输出文件名 local full_cmd="$*" local output_file="${!#}" # 从完整命令里移除最后一个参数(输出文件),得到真正要执行的命令 local exec_cmd="${full_cmd% $output_file}" # 先把命令写入文件开头 echo "$exec_cmd" > "$output_file" # 加两行空行 echo -e "\n\n" >> "$output_file" # 执行命令并把输出追加到文件里 eval "$exec_cmd" >> "$output_file" }
使用方法
比如你要生成meminfo.txt,直接运行:
cmd2file "cat /proc/meminfo" meminfo.txt
这样meminfo.txt里就会先显示cat /proc/meminfo,接着两行空行,然后是/proc/meminfo的内容。不管你的命令里有多少特殊符号(比如>、|、*),都不用手动转义,函数会自动处理。
注意:
eval会执行变量里的命令,如果你是在公共环境里用,要确保传入的命令是安全的,避免注入风险。如果只是自己用,完全没问题。
退而求其次:替换示例中的pipeSymbol为>
如果暂时不想用函数,那把示例里的pipeSymbol换成>就行。因为在sed的替换字符串里,>不是特殊字符,不需要转义,直接替换即可:
cat /proc/meminfo > meminfo.txt; sed -i '1s/^/cat \/proc\/meminfo > meminfo\.txt \n\n/' meminfo.txt
如果你的系统是BSD(比如macOS),sed的换行符需要用双反斜杠,且-i参数要加空字符串后缀,改成这样:
cat /proc/meminfo > meminfo.txt; sed -i '' '1s/^/cat \/proc\/meminfo > meminfo\.txt \\n\\n/' meminfo.txt
内容的提问来源于stack exchange,提问作者Bobby
相关产品推荐
相关产品推荐

