如何使用Tcl 9.0解压并提取.tar.gz归档文件?
问题:Tcl tar包解压gzip压缩tar文件失败
背景
我有一段可正常运行的Shell命令:
tar -x --directory "$inner" --strip-components 1 <"$inner.tar.gz"
这是我正在迁移为Tcl代码的Shell脚本的一部分。我可以用exec命令保留原有逻辑,但想尝试用Tcl的通道功能实现。
尝试的示例与问题
我找到一个Tcl tar包的示例:
#! /bin/env tclsh package require tar set chan [open myfile.tar.gz] zlib push gunzip $chan set data [::tar::get $chan some_file_in_tarball -chan] close $chan
但花费数小时仍无法成功运行,遇到以下问题:
问题1:gzip解压通道不可寻道
使用Tcl 9.0.3和tar包0.13时,执行以下命令报错:
% info patchlevel 9.0.3 % package require tar 0.13 % set chan [open package.tar.gz rb] file5 % zlib push gunzip $chan file5 % ::tar::contents $chan -chan error during seek on "file5": invalid argument
我理解tar包需要可寻道文件,但zlib push gunzip $chan会让通道变为不可寻道。
问题2:直接操作tar文件报错
简化问题,直接操作未压缩的tar文件,仍报错:
% ::tar::contents package.tar expected integer but got "0ush: "
已通过Shell命令tar -t <package.tar确认该tar包有效。
补充信息
- 使用macOS自带的旧版
tclsh(版本8.5.9,tar包版本0.6)可成功运行tar包命令:% info patchlevel
8.5.9
% package require tar
0.6
% llength [::tar::contents package.tar]
207
推测Homebrew安装的tcl-tk附带的`tar`包与Tcl 9.0不兼容。 - 后续找到相关bug报告,问题源于八进制转换错误,补丁已包含在tar包0.14版本中,而Homebrew安装的是0.13版本,我将尝试安装新版本。 内容的提问来源于stack exchange,提问作者davidchambers
相关产品推荐
相关产品推荐

