命令像 wc 但有 tee 行为

Maj*_*imi 5 pipe io-redirection text-processing tee wc

我想使用psqlCOPY命令备份数据库。这是我的脚本:

psql "user=${USERNAME} host=${HOSTNAME} dbname=${DBNAME} password=${PASSWORD}" -c \
"COPY (SELECT * FROM tbl) ORDER BY id ASC) TO STDOUT WITH CSV HEADER;" | \
bzip2 -z -f --best -c > /home/${DBNAME}-${FILENAME}.csv.bz2
Run Code Online (Sandbox Code Playgroud)

另外我想知道从数据库中复制了多少行,但 psql 没有这样的功能。所以我需要外部命令。我需要这样的东西:

psql ... | wc -l | bzip2
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?我发现的唯一解决方案是使用fifo:

mkfifo /home/backup.fifo
psql ... | tee /home/backup.fifo | bzip2
Run Code Online (Sandbox Code Playgroud)

现在从另一个终端窗口我可以使用wc

wc -l /home/backup.fifo
Run Code Online (Sandbox Code Playgroud)

gee*_*aur 11

双方bashzsh有一个>(pipeline)特点:

psql ... | tee >(wc -l) | bzip2
Run Code Online (Sandbox Code Playgroud)

请注意,>here 不是正常的重定向,而是语法的必要部分。>如果您想将它与实际重定向结合起来(中间有一个空格,因此它不会被读取为>>附加重定向),则需要一秒钟。

  • @MajidAzimi 它被称为 [Process Substitution](http://mywiki.wooledge.org/ProcessSubstitution)。 (2认同)
  • 你可能想要 `>(wc -l >&2)` 除非你希望 `wc` 输出也被 bzip 压缩。 (2认同)