当前位置: 技术问答>linux和unix
关于管道的用法
来源: 互联网 发布时间:2017-01-06
本文导语: 例如: find path -name filename 假设在path路径下找到一些filename文件,然后我向继续对找到的这些文件操作 find path -name filename | rm -r # error 正确的一个方法是: find path -name filename | xargs rm -r 问题1:为...
例如:
find path -name filename
假设在path路径下找到一些filename文件,然后我向继续对找到的这些文件操作
find path -name filename | rm -r # error
正确的一个方法是:
find path -name filename | xargs rm -r
问题1:为什么使用管道不可以向rm传递参数,必须用xargs指明?
问题2:换一种写法,效果达到了(即删除了找到的文件),但是最后却提示找不到文件?
find path -name filename -exec rm -r {} ;
请指导!
find path -name filename
假设在path路径下找到一些filename文件,然后我向继续对找到的这些文件操作
find path -name filename | rm -r # error
正确的一个方法是:
find path -name filename | xargs rm -r
问题1:为什么使用管道不可以向rm传递参数,必须用xargs指明?
问题2:换一种写法,效果达到了(即删除了找到的文件),但是最后却提示找不到文件?
find path -name filename -exec rm -r {} ;
请指导!
|
rm不接受标准输入作为参数,所以不可以直接用管道
xargs就是把标准输入的内容构造成命令行再执行的
xargs就是把标准输入的内容构造成命令行再执行的
|
程序分两种,一种是运行前传命令行参数的,一种是跑起来之后读STDIN_FILENO的。
如果是需要命令行参数的,管道是没有用的,所以需要用xargs这个程序读管道的标准输出作为命令行参数,由xargs来execl你的程序传入命令行参数。
如果是需要标准输入的,直接管道就可以了,因为管道命令创建的子进程会调用dup2把自己的STDIN_FILENO描述符共享管道的读端文件表项,今后子进程execl管道线后的程序,那个程序读标准输入就等于在读管道的读端。
楼主可能单纯从记忆上很难理解这些,但如果熟悉LINUX编程开发的话,这些都不是什么难题。
如果是需要命令行参数的,管道是没有用的,所以需要用xargs这个程序读管道的标准输出作为命令行参数,由xargs来execl你的程序传入命令行参数。
如果是需要标准输入的,直接管道就可以了,因为管道命令创建的子进程会调用dup2把自己的STDIN_FILENO描述符共享管道的读端文件表项,今后子进程execl管道线后的程序,那个程序读标准输入就等于在读管道的读端。
楼主可能单纯从记忆上很难理解这些,但如果熟悉LINUX编程开发的话,这些都不是什么难题。