在设计一系列命令以执行某个任务时,我遇到了匿名管道行为不如预期的问题。由于我运行的原始命令太复杂,无法在此处解释,因此我创建了一个示例来展示问题(我知道这些命令基本上没有做任何事情)。此外,我使用 pv 来显示数据是否实际从输入复制到输出。
cat /dev/zero | pv > /dev/null
这个操作按预期工作。(将数据从/dev/zero复制到/dev/null)
cat /dev/zero | tee /dev/null | pv > /dev/null
这也像预期的那样运行(复制数据并将两个副本都发送到 /dev/null)
cat /dev/zero | tee >(pv -c > /dev/null) | pv -c > /dev/null
这个命令只能部分运行。虽然从STDIN到STDOUT的复制仍然有效(pv会短暂地显示进度),但整个命令会被匿名管道阻塞,匿名管道收不到任何数据,因此tee也会被阻塞,无法写入其中一个输出(我通过让其写入文件而不是/dev/null来检查了这一点)。
如果有人知道为什么在bash中(如预期的那样)不能正常工作,我会很感激帮助。
PS:如果我使用zsh而不是bash,则命令将按预期运行。不幸的是,需要运行该命令的系统没有zsh,我无法在该系统上部署zsh。
bash -c
运行或在子shell中运行(即:(cat /dev/zero | tee >(pv -c > /dev/null) | pv -c > /dev/null)
)似乎是有效的... 在交互式 shell 中运行它会像你所说的那样挂起,我不知道为什么。 - FatalErrorpv
上发生吗?因为当我使用cat
替换第一个pv
时,它对我有效。也许pv
不支持进程替换魔法? - Vasily Gecho "abc" | cat
,如果你使用的是旧版 Unix 系统,则可能需要使用echo "abc" | cat -
(-
表示从标准输入读取)。祝大家好运。 - shellter-
作为标准输入也非常方便。考虑以下例子:yadda | cat header.txt - footer.txt
- ghoti