当我通过管道传输多个 unix 命令(例如 grep、sed、tr 等)时。我倾向于指定正在使用 cat 处理的输入文件。所以像cat file | grep ... | awk ... | sed ....
但是最近在我的答案留下了一些评论表明这是 cat 的无用用法之后,我想我会在这里问这个问题。
我查了一下这个问题,看到了维基百科关于 UUOC和The Useless Use of Cat Award的文章,在我看来,提出的论点是从效率的角度来看的。
我在这里遇到的最接近的问题是这个:打电话给猫是浪费吗?——但这不是我要问的。
我猜 UUOC 阵营建议使用什么,cmd1 args < file | cmd2 args | cmd3 ..或者如果该命令具有从文件读取的选项,然后将文件作为参数传入。
但对我来说cat file | cmd1 ... | cmd2似乎更容易阅读和理解。我不必记住将输入文件发送到不同命令的不同方式,并且该过程逻辑上从左到右流动。首先输入,然后是第一个过程……依此类推。
我是否无法理解关于 cat 的无用使用的争论?我知道如果我正在运行一个每 2 秒运行一次并进行大量处理的 cron 作业,那么在这种情况下 cat 可能会很浪费。但除此之外,使用 cat 的普遍共识是什么?
GoPro 摄像机将视频分割成 4GB MP4 文件。
尝试将它们与 ffmpeg 4.4.1 合并,如下所示:
ls GH017642.MP4 GH027642.MP4 | while read line; do echo "file '$line'"; done | ffmpeg -protocol_whitelist file,pipe -f concat -i - -c copy out.mp4
Run Code Online (Sandbox Code Playgroud)
失败并显示:
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x5573df8c9ec0] moov atom not found
[concat @ 0x5573df8b7ec0] Impossible to open 'pipe:GH017642.MP4'
pipe:: Invalid data found when processing input
Run Code Online (Sandbox Code Playgroud)
不过,“moov”似乎确实存在于该文件中:
> ffmpeg -v trace -i GH017642.MP4 2>&1 | grep -e type:\'mdat\' -e type:\'moov\'
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55a71e111dc0] type:'mdat' parent:'root' sz: 3999992669 28 4001343671
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55a71e111dc0] …Run Code Online (Sandbox Code Playgroud)