本文主要是介绍Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目标,在Rust程序里解压.tar.bz2压缩包。
折腾了大半天,走了很多弯路。一是经验不足,没有及时想到合适的Shell,二是我的应用场景是在Windows系统下调用Linux命令行,难度较大。
一开始就想到std::process::Command
,要执行的是一个SHELL进程,参数有两个,参数1是"/C"或"-c",参数2是命令行。此信息Command的docs里有明示,还有例子。只是我此前理解不深入,把tar当作进程、把-xvf
等当作tar的参数,一开始起点就偏了。把tar当进程勉强还行(Windows10系统目录里有tar.exe),可要解压的是.tar.bz2文件,tar还得另外调用bzip2进程,后面直接就报莫名其妙的错误。后来我把Git安装目录里的usr/bin/sh.exe当作SHELL做了很多尝试都失败了(其实距离git-bash.exe仅有一步之遥,偏偏当时想不到),最大的问题是它大概率会在解压过程中卡死,成功率极低,原因不明。
在用Command没搞定的情况下,我又尝试了多种其它方法:
- 使用tar库能解压.tar不能解压.tar.bz2文件;
- 使用zip库解压.tar.bz2文件时报文件头错误;
- 使用bzip2库只能处理数据流不涉及文件操作;
- 用7z.exe解压它先解出.tar不能一步到位。
最后又回到Command执行SHELL的路子,引入git-bash.exe才最终搞定。
- 总结1:Linux SHELL的参数1为"-c"时(Windows的cmd.exe为"/C"时),参数2被当作命令行直接执行;否则参数1被当作脚本文件执行。如果你要执行的既不是命令行也不是脚本文件,那直接执行就好了,不需要作为SHELL的参数。也就是说Command有三种执行模式:1执行SHELL命令行(“-c”);2执行SHELL脚本文件(.sh/.bat);3执行普通exe(有自己的参数)。
- 总结2:在Windows系统里调用Linux命令行,可用Git安装目录里的git-bash.exe当作SHELL,参数1为"-c",参数2为命令行
tar -xvf file.tar.bz2
,即上述执行模式1,实验证实可行。其实我两年前用过git-bash.exe,在任务计划(taskmgr)里调用它执行.sh脚本(无"-c"参数,即执行模式2)。其实git-bash.exe加上"-c"参数就可用执行Linux命令行(执行模式1),只是我一开始没想到,后来才恍然大悟。 - 总结3:使用
std::env::set_current_dir()
设置当前路径可大幅简化tar命令行。否则要在tar命令行里指定输入输出目录的话,还得手工拼接字符串(不能用Command.arg()),还要考虑Windows和Linux路径的不同(git-bash.exe使用精简版msys64,C:\Windows
在其中表示为/c/Windows
)。 - 总结4:遇到命令行参数错误,黑窗口又一闪而过根本看不清错误反馈时,可用在命令行末尾加上
|| sleep 6
,延时几秒钟很有用(仅前面命令失败了才延时)。
缺点和不足:通过Command调用SHELL执行命令行或脚本,Command.output()返回的是SHELL本身的执行结果,而非SHELL内部命令或脚本的执行结果。即使内部命令或脚本执行错误,SHELL自身执行依然是成功的。此外我们也拿不到它内部输出的stdin/stdio文本,不方便排查问题。调用SHELL命令行解压,如果可预测解压后的文件,可通过文件是否存在判断是否解压成功,否则不好判断。
这篇关于Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!