管道

声明:所有文章只作为学习笔记用,转载非原创


管道有两种 一种是匿名管道,一种是通过mkfifo 建立的命名管道
 mkfifo a.fifo


原因是管道实现的是进程间通信,两个进程之间存在交叉,在运行ps进程后开始收集进程信息,grep也已经开始并处于等待接收数据状态,当ps收集到任何数据后都将输出放入内存由管道传递给grep进行筛选。

管道其本质是数据传递,管道左边的输出数据放入内存,由管道右边的进程读取
例如echo "abcd" | passwd --stdin username,表示将进程echo的输出结果"abcd"作为进程passwd的输入数据。

#结合  https://www.cnblogs.com/f-ck-need-u/p/7325378.html 

标准输入 = /dev/stdin   = 代号0 = <符号(注意,没有包含<<符号)。

标准输出 = /dev/stdout = 代号1 = >或>>符号。

标准错误输出 = /dev/stderr = 代号2 = 使用2>或2>>符号。
注意,上面的/dev/std{in,out,err}分别是0、1、2默认的输出目标,当重定向后,就不再使用这些目标。具体见后文。

<、>、2>实现的是覆盖功能,>>、2>>实现的是追加的功能,
但是注意"<<"不是追加功能,而是表示此处生成文档(here document),在后面cat和重定向配合的内容里有说明。此外,还有<<<,它表示此处字符串(here string),


有时候,使用"-"也表示/dev/stdin
cat /etc/fstab | cat -

"&"符号表示描述符重用(fd 2 duplicate from fd 1)

可以使用set -C来设置如果输出重定向文件已经存在则不覆盖。使用set +C来取消set -C的效果。如果在设置了set -C时仍然想强制覆盖,可以使用“>|”代替“>”来重定向输出。同理错误输出也有此特性。

set -o +o 

[root@xuexi tmp]# set -C

[root@xuexi tmp]# cat flip >ttt.txt
-bash: ttt.txt: cannot overwrite existing file

[root@xuexi tmp]# cat flip >| ttt.txt

[root@xuexi tmp]# set +C

<

你可能感兴趣的:(管道)