声明:所有文章只作为学习笔记用,转载非原创
管道有两种 一种是匿名管道,一种是通过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
<<eof",它表示here document,此后输入的内容都作为一个document输入给cat。既然是document,那就肯定有document结束符标记document到此结束,结束符使用的是here document后的字符,例如此处为eof。其实不使用eof,使用其他字符也是一样的
#<<<
对于here string,表示将<<<后的字符串作为输入数据。
例如:
passwd --stdin user <<< password_value
等价于:
echo password_value | passwd --stdin user