如何显示NUL分隔数据的中间管道结果?

时间:2017-06-23 21:26:43

标签: bash sh

如何组合以下两个命令:

find . -print0 | grep -z pattern | tr '\0' '\n'
find . -print0 | grep -z pattern | xargs -0 my_command
进入单一管道?如果我不需要NUL分隔符,那么我可以这样做:

find . | grep pattern | tee /dev/tty | xargs my_command

我想避免使用这样的临时文件:

find . -print0 | grep -z pattern > tempfile
cat tempfile | tr '\0' '\n'
cat tempfile | xargs -0 my_command
rm tempfile

这个问题是对这些答案的后续跟进:

1)使用/ dev / tty显示中间管道结果:

https://unix.stackexchange.com/a/178754/8207082

2)使用NUL分隔的文件列表:

https://stackoverflow.com/a/143172/8207082

编辑使用my_command代替command

后续问题:

Makefile rule that writes to /dev/tty inside a subshell?

3 个答案:

答案 0 :(得分:5)

你可以改变tee指向proc sub,然后在那里做同样的事情。

   find . -print0 | grep -z pattern | tee >(tr '\0' '\n' > /dev/tty) | xargs -0 command

以这种方式使用tee的唯一问题是,如果xargs命令也打印到屏幕,那么所有输出都可能混乱,因为管道和进程子都是异步的。

答案 1 :(得分:1)

其中一种可能性:

find . -print0 | grep -z pattern | { exec {fd}> >(tr '\0' '\n' >/dev/tty); tee "/dev/fd/$fd"; } | xargs -0 command

我们在飞行中创建一个临时文件描述符fd,其中exec通过标准进程替换连接到tr的stdin。 tee将所有内容传递给stdout(以xargs结尾),并将副本传递给输出到tr的{​​{1}}子进程。

答案 2 :(得分:-1)

可以使用xargs执行多个命令,如下所示:

id

来源:

https://stackoverflow.com/a/6958957/8207082

根据讨论,以上是不安全的,这要好得多:

users