find . -name *.svn| rm -rf
rm: missing operand
这是为什么?
因为rm不支持管道线。
但是grep,xargs等就可以。
这个改为find . -name *.svn| xargs rm -rf
记住:不是所有命令都支持管道!
从管道的实现来解释这个问题。
pipe.c
int main(argc,argv[])
{
int fp[2];
fp=pipe();
if(fork()>0)
{
close(fp[0]);
dup(fp[1],1);
printf("parent process!!\n");
execl("argv[0]");//进程1 写管道
}
else
{
close(fp[1]);
dup(fp[0],1);
printf("read process!!\n");
}
}
0是读管道,1是写管道。
和明显,如果rm做为管道的读端,他必须在代码里面能够读终端数据
他的函数伪代码代码可以如下:
rm.c
main(argc,argv[])
{
getchar form argv (common line)
if(common line !=0)
..................
else
//getchar(); getdataform terma
printf("missing operand!")
if(key==enter)
{
work();
}
}
很明显。红色部分rm没有。导致不支持。
其实很简判断哪些命令支不支持
如果不能从终端读数据,就不能作为管道的后端。
但是grep就行,你这样操作grep "11" enter
发现可以输入!!!!
你懂了吧。
注明:所有代码均是伪码!!!!!
代码均不是直接抄录。只是原理推测!不要太挑细节!!
如果要核对,请看源码!
尽信书,不如无书!
举一反三。不要被浩瀚的源码给绑架!