【发布时间】:2019-05-06 15:02:34
【问题描述】:
使用 ZSH,我试图将 sed 命令包装到一个函数中,然后使用它,同时将管道与进程替代混合。 让我用一个例子来解释:
$ echo "test text" | gzip > myfile.gz
$ sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g' <(zcat myfile.gz) | more
test text
$ ncat() { sed $'s,\x1b\\[[0-9;]*[a-zA-Z],,g' $@; }
$ zcat myfile.gz | ncat | more
test text
$ ncat <(zcat myfile.gz) | more
sed: can't read /proc/self/fd/13: No such file or directory
如您所见,这 3 种用法中的 2 种有效。最后一个是这里让我感兴趣的一个。 (请注意,所有命令都适用于 bash)
你能解释一下为什么在输入中使用进程替换的函数的输出不能通过管道使用吗?
我不是在寻找一种解决方法来让我的示例工作。我正在寻找解释,因为我找不到。
仅供参考 sed 在这里不相关,我尝试了多个其他命令(echo、cat...),得到了相同的结果
【问题讨论】:
-
命名管道在哪里?
-
您是在用
<(...)谈论进程替换吗? -
是
-
您可以混合使用进程替换和管道,因为它适用于第二个命令。我认为问题在于您试图将进程替换用作函数的参数。
-
该函数由于管道而在子shell中运行,并且该子shell不继承连接到管道的FD。
标签: linux pipe zsh process-substitution