shell 展开之进程替换# 深度解析 管道符|和输入输出<< >>重定向的区别
参考链接
https://blog.csdn.net/zwlove5280/article/details/113609342
shell 展开中的进程替换可以说是非常难懂的一部分,它的语法为有两种
>(list) ##接受输入 看作一个整体,相当于文件描述
或
<(list) #接受输出
在 << The Linux Command Line>> 一书中提到了这样一个事,代码如下
echo david | read user
echo $user # 输出结果为空
通过管道把echo的输出作为read命令的输入,然后输入保存到user变量中,但是输出user变量的结果却为空。这是因为管道后的命令是在子shell中执行的
,因此当子shell执行完毕后,回到当前shell时,user变量是不可见的。
解决办法,使用输入重定向<<< 后面是纯字符,不能使用函数
read user <<< "david"
echo $user
其实也可以通过进程替换来解决管道的问题,如下 (<()括号里面可以跟函数)
read user < <(echo david)
echo $user # 结果为david
实例:
相当于source执行了文件,文件里面的内容是trojan completion bash
总结
不管是>(list)语法,还是<(list)语法,其实我们就把它当作一个文件,这个文件包含list中的所有命令,并且这个文件是打开的,文件描述符为 /dev/fd/63。