写一个main.c:
#include <stdio.h>
int main(){
printf("foo");
printf("bar");
return 0;
}
然后gcc编译为test.
然后在工作目录下建立两个目录:foo,bar
然后./test | xargs rm -rf
其实以上命令是删除不掉foo和bar的。
然后再来看以下
写一个main.c:
#include <stdio.h>
int main(){
printf("foo ");
printf("bar ");
return 0;
}
然后gcc编译为test.
然后在工作目录下建立两个目录:foo,bar
然后./test | xargs rm -rf
其实以上命令是能把foo bar删除了的。
然后再修改main.c
#include <stdio.h>
int main(){
printf("foo bar ");
return 0;
}
以上的修改是也能删除foo和bar
然后再修改main.c
#include <stdio.h>
int main(){
printf("foo bar");
return 0;
}
以上的修改是也能删除foo和bar
所以总结:
xargs是把整个输入流中的字符串遇到空格和换行符' '就截断为参数字符串(比如"foo bar"会被截断为两个字符串"foo"和"bar")传递给rm的,之前的foo和bar的输出没有换行符和空格,输出来就是“foobar”,由于工作目录没有建立foobar目录,当然就删除不掉了,所以也删不掉foo,bar目录。这样很显然是违背用户意愿了,如果工作目录下真存在foobar目录呢?万一这个目录很重要呢?那就悲剧了。
真相如下:
如果这回test是输出"foo bar"
有xargs的:(这个很明显能看到xargs的作用了)
./test | xargs strace rm -rf
execve("/bin/rm", ["rm", "-rf", "foo", "bar"], [/* 50 vars */]) = 0
brk(0) = 0x17fc000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6e5fc7b000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=78756, ...}) = 0
mmap(NULL, 78756, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6e5fc67000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "177ELF211 3 >