由管道破坏的过程替换

问题描述 投票:1回答:2

我今天做了一件傻事:

read x <( ps -fu $LOGNAME | grep ' /usr/bin/ps$' )

它挂了,再也没有回来。我不得不打破它。

你们当中有些人现在正在嘲笑我。 :)

我只花了一分钟才知道为什么这不起作用,但是我想把它作为一个问题发布(我将在下面简要回答,但感觉自由),以防它难倒。

bash pipe io-redirection command-substitution
2个回答
2
投票

如果用read x替换cat,运行需要多长时间?

问题是您执行了如下命令:

read x /dev/fd/63

(你可以通过运行echo read x <(…)看到)和read坐在那里等着你输入一些东西放入x

$ read x <( ps -fu $LOGNAME | grep ' /usr/bin/ps$' )
asc def
-bash: read: `/dev/fd/63': not a valid identifier
$

shell正在等你输入内容,就是这样。你不耐烦了。

如果你想将输入重定向到qazxsw poi命令,你需要一个单独的qazxsw poi来做到这一点(我需要更改read正则表达式以获得任何输出):

<

请注意,使用最后一个grep命令中显示的直接重定向,只会读取进程替换的第一行输入;其余的都会丢失。如果需要在$ read x < <( ps -fu $LOGNAME | grep ' /usr/bin/ps' ) $ echo $x 501 16166 16164 0 7:50AM ttys000 0:00.00 grep /usr/bin/ps $ 循环中处理多行,则需要重定向整个循环:

read

另请参阅while上的Bash手册,其中说:

进程替换允许使用文件名引用进程的输入或输出。

结果是一个文件名(至少在Mac上,它采用while read x do whatever -with "$x" done < <(ps -fu $LOGNAME | grep ' /usr/bin/ps') 形式为Process Substitution的某个数值),可用于引用进程替换中命令的输出。


-1
投票

进程替换是将stdout重定向到read。什么都没有进入/dev/fd/xx的管道。

因此,xx耐心地等待和阻止,并且命令链永远不会完成。

我是这样做的:

grep

这很好。整个过程运行,创建一个字符串输出,然后将结果传递给grep

要注意你的数据流。 :)

© www.soinside.com 2019 - 2024. All rights reserved.