You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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直接调用:

  1. 修改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
  1. 给脚本添加执行权限:
chmod +x ./test-function.sh
  1. 执行tar命令调用脚本:
tar -xzi --to-command='./test-function.sh' your_archive.tar.gz
  • 关键说明:tar会为每个提取的文件启动一次脚本,并通过环境变量传递关键信息:
    • $TAR_FILENAME:归档内的原始文件名
    • $TAR_SIZE:文件大小
    • 文件内容会通过标准输入传递给脚本,所以可以直接用管道处理

注意事项

  • 如果处理二进制文件,避免使用sed等文本处理工具,防止破坏文件结构
  • 脚本中处理路径时,务必用dirname "$TAR_FILENAME"确保目录存在,否则写入文件会失败

内容的提问来源于stack exchange,提问作者rxFt20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:15:29