Windows下执行`tar -xvf file.tar.bz2`解压bzip2文件

2024-02-01 03:28

本文主要是介绍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文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665944

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消