发布网友 发布时间:2022-04-22 08:56
共1个回答
热心网友 时间:2022-04-18 17:19
管道是一个先进先出的特殊文件,一方只能依次写进去,另一方也只能依次读出来
理解管道符前先要知道一个进程运行后有3个最基本的文件,标准输入(0表示),标准输出(1表示),错误输出(2表示)
通过命令查看当前 3个基本文件,ls -l /proc/$$/fd/
shell 中的管道符做了3件事,
1 ,先创建一个管道文件pipe
2,将管道符 前面的一个命令的 标准输出替换为pipe
2,将管道符 后面的一个命令的 标准输入替换为pipe
例子
echo test >/tmp/test
tail -f /tmp/test | cat &
查看tail命令3个基本文件
ls -l /proc/`pidof tail`/fd
查看cat命令3个基本文件
ls -l /proc/`pidof cat`/fd
shell重定向 本身从编程角度理解就是 赋值语句, 0 ,1 ,2 本身理解为3个变量,
< 和 >表示赋值符号, 变量名只能用数字表示,变量只能在 /proc/进程pid/fd/下查看
< 以只 读 方式打开一个文件,然后把打开的文件赋值给变量
> 以只 写 方式打开一个文件,然后把打开的文件赋值给变量
<> 以 读写 方式打开一个文件,然后把打开的文件赋值给变量
exec 1<>/tmp/info 表示读写打开/tmp/info,然后赋值给变量1,执行后其他命令打印的信息都会输入到 /tmp/info 里,默认所有的打印信息(echo aaaaaa)都会获取变量1里面打开的文件,然后把要打印的信息写到这个文件里面
如果写成 exec 1</tmp/info 这种方式,那么打印的信息就没法写进去了,因为是只读方式打开的
ls -l /dev/fd/ 或者 ls -l /proc/$$/fd/ 查看
cat /proc/cmdline >/tmp/cmd 通常啥这种写法,赋值符号前面没写具体的变量名,默认就是1 ,也就是 cat /proc/cmdline 1>/tmp/cmd
echo r >/tmp/r && exec 6</tmp/r
lsof |grep /tmp/r 可以查看到6r属性, 文件以 读方式开打,并且复制给变量6