理解管道符前先要知道一个进程运行后有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
ABC。关于linux中的管道,下面ABC描述是正确的。linux中的管道正确答案是管道就是一种特殊的输入输出重定向。管道就是将一个命令的标准输出重定向为另一个一个命令的标准输入。完成复杂任务往往需要构造命令管道。管道举例:ls -a | grep netkeeper
说明:就是把前一个命令的结果当成后一个命令的输入。结合本例就是先显示所有的文件,然后再用grep命令在ls的结果中查找包含netkeeper的文件。
重定向
举例:cat hello.c >/home/root/Documents/test.txt
说明:就是把原本应该输出(或输入)到一个地方的文件流输出(或输入)到另外一个地方。把文件方向给改变了,所以叫重定向。结合本例:cat本来是要把hello.c的内容显示到当前屏幕上,但是加了个重定向后,这个输出流就被定向到/home/root/Documents/目录下的test.txt文件中去了。
>与>>
>会覆盖目标文件;>>是向目标文件末尾追加内容。
如果目标文件不存在,那么这两个命令都会在指定的目录下新建文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)