我今天做了一件傻事:
read x <( ps -fu $LOGNAME | grep ' /usr/bin/ps$' )
它挂了,再也没有回来。我不得不打破它。
你们当中有些人现在正在嘲笑我。 :)
我只花了一分钟才知道为什么这不起作用,但是我想把它作为一个问题发布(我将在下面简要回答,但感觉自由),以防它难倒。
如果用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的某个数值),可用于引用进程替换中命令的输出。
进程替换是将stdout重定向到read。什么都没有进入/dev/fd/xx
的管道。
因此,xx
耐心地等待和阻止,并且命令链永远不会完成。
我是这样做的:
grep
这很好。整个过程运行,创建一个字符串输出,然后将结果传递给grep
。
要注意你的数据流。 :)