如何将tar的--to-command输出传递给自定义函数?
解决tar --to-command调用自定义函数的问题
tar的--to-command参数默认只会查找系统PATH里的可执行命令,或是直接执行独立进程,无法直接识别当前shell中的自定义函数。以下两种方案可以解决你的问题:
方案一:通过bash -c加载脚本并调用函数
无需提前将函数导入当前shell,直接让tar启动的bash进程自行加载脚本并执行函数:
tar -xzi --to-command='bash -c "source ./test-function.sh && post_extract"' your_archive.tar.gz
- 原理:
bash -c会启动新的bash实例,先通过source加载脚本中的post_extract函数,再执行该函数 - 优势:不需要修改原脚本结构,适合临时测试或脚本仅用于单次任务的场景
方案二:把函数包装成可执行脚本
将函数改造为独立的可执行脚本,让tar直接调用:
- 修改
test-function.sh的内容,添加执行入口:
#!/bin/bash post_extract() { # 这里编写你的后处理逻辑,示例: # 1. 确保目标目录存在(tar不会自动创建目录) mkdir -p "$(dirname "$TAR_FILENAME")" # 2. 转换编码并执行sed替换,结果写入目标文件 iconv -f GBK -t UTF-8 | sed 's/旧内容/新内容/g' > "$TAR_FILENAME" } # 执行函数 post_extract
- 给脚本添加执行权限:
chmod +x ./test-function.sh
- 执行tar命令调用脚本:
tar -xzi --to-command='./test-function.sh' your_archive.tar.gz
- 关键说明:tar会为每个提取的文件启动一次脚本,并通过环境变量传递关键信息:
$TAR_FILENAME:归档内的原始文件名$TAR_SIZE:文件大小- 文件内容会通过标准输入传递给脚本,所以可以直接用管道处理
注意事项
- 如果处理二进制文件,避免使用
sed等文本处理工具,防止破坏文件结构 - 脚本中处理路径时,务必用
dirname "$TAR_FILENAME"确保目录存在,否则写入文件会失败
内容的提问来源于stack exchange,提问作者rxFt20
相关产品推荐
相关产品推荐

