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

macOS下Zsh中如何用tee将tmutil输出分发给多管道命令

单次运行tmutil status提取备份进度与剩余时间

问题背景

使用tmutil status查看Time Machine备份状态时,输出如下:

% tmutil status
Backup session status:
{
    BackupPhase = Copying;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2022-11-21 11:23:03 +0000";
    DestinationID = "89E08126-7132-4D14-80B4-EFD45E8C5BFC";
    FirstBackup = 1;
    Progress =     {
        Percent = "0.1640944884974286";
        TimeRemaining = 65013;
        "_raw_Percent" = "0.1640944884974286";
        "_raw_totalBytes" = 488603537408;
        bytes = 80177147549;
        files = 159679;
        totalBytes = 488603537408;
        totalFiles = 3345928;
    };
    Running = 1;
    Stopping = 0;
}

原本可用以下两条命令分别提取完成百分比和剩余时间:

  • 提取完成百分比:
    tmutil status | grep "raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"} '
    
  • 提取剩余时间:
    tmutil status | grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"} '
    

但由于tmutil status开销较大,希望仅运行一次该命令并将输出分发给两个处理管道。尝试的命令报错:

tmutil status | tee > (grep "raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"} ') | (grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"} ')

报错信息:

zsh: no matches found: (grep raw_Percent | LC_NUMERIC=C awk -F " {print "Percent Complete: " ($4 * 100) "%"} )

解决方法

方法1:修正进程替换的语法问题

zsh报错是因为进程替换的括号前后空格、内部引号解析混乱。修正后的命令如下:

tmutil status | tee >(grep "_raw_Percent" | LC_NUMERIC="C" awk -F '"' '{print "Percent Complete: " ($4 * 100) "%"}') | grep "TimeRemaining" | awk '{print "Time Remaining: " ($3/3600) " hours"}'

关键修正点:进程替换的>(...)括号前后不能加空格;确保awk脚本的引号嵌套正确,避免shell误解析。

方法2:用awk一次性处理(更高效)

无需多次管道和grep,直接用awk单次扫描输出即可同时提取两个字段,性能更优:

tmutil status | LC_NUMERIC="C" awk '
/_raw_Percent/ { 
    percent = $3 * 100; 
    gsub(/"/, "", percent); 
    printf "Percent Complete: %.2f%%\n", percent 
}
/TimeRemaining/ { 
    hours = $3 / 3600; 
    printf "Time Remaining: %.2f hours\n", hours 
}'

说明:

  • 用正则匹配目标行,直接提取对应字段计算
  • gsub(/"/, "", percent)去除百分比字段的引号
  • printf可格式化输出小数位数(按需调整)
  • LC_NUMERIC="C"确保小数用点号而非逗号,避免计算错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:10:29