近半年一直在linux环境下进行开发,使用的版本工具为svn
每次提交代码时候,我都是使用
svn st|svn ci -m 'xxxxxx'进行代码提交,我一直以为svn st首先列出需要上传的代码列表,然后通过管道到svn ci命令进程中。
直到今天同事看到我这样操作,来问我为什么需要在svn ci前面svn st,我才发现了自己对于linux命令和管道认识上的一个巨大的错误。
首先,对于管道(|)来说,他的作用将前一个命令进程的标准输出作为后一个命令进程的标准输入,注意,是标准输入,而不是命令参数。
所以,这也就是为什么sed命令需要跟在cat等获取文本详情的命令后面,因为sed需要使用前者的输出作为输入来处理,sed自己的参数中不包含要处理的文本内容,文本内容是需要从标注输入获取到的。
这里,就需要根除第二个命令,就是xargs,这个命令可以通过管道将标准输入作为管道后的命令的参数
这个举一个例子
cd ~
ls dir/| ls
假如$home目录下现在有a.txt,b.txt, dir/c.txt
那么ls dir/c.txt | ls会输出下面的结果:
-rwxrw-r-- c.txt
-rwxrw-r-- a.txt
-rwxrw-r-- b.txt
drwxr-x--x c
为什么不是
-rwxrw-r-- c.txt
-rwxrw-r-- c.txt
呢?
因为ls命令是不读取标准输入的,他直接使用参数的,也就是具体要显示那个文件或者文件夹都是需要通过参数来的,而管道做不到将输入作为后面命令的参数,所以需要使用xargs来做这件事情。
ls c/ | xargs ls
这样输出的就是
-rwxrw-r-- c.txt
-rwxrw-r-- c.txt