管道|
我们在Linux中很常见,那么他是什么作用?
- 管道可以实现:将前面的标准输出作为后面命令的
标准输入
; - 管道无法实现:将前面的标准输出作为后面命令的
命令参数
。
这个时候,就要有请 xargs 这位护花使者了。xargs 所擅长的正是“将标准输入作为其指定命令的参数”。
这里我们举例来说明:
假设有一个在/WorkStation/
目录下有一个文本arg.txt
,里面的内容通过cat
命令可以看到如下:
(base) benjamin@JieDev:~/WorkStation$ cat arg.txt
aaa
bbb
ccc
同时在这个目录下我们也有一个sk.sh
的脚本,其内容如下:
#!/bin/bash
#sk.sh命令内容,打印出所有参数。
echo $*
这个脚本如果执行的话,效果如下:
# 这里执行当前目录的脚本,加上了`./`,表明该脚本在当前目录下
# 更多关于脚本执行的细节:请参考 https://www.jianshu.com/p/ba6efda13e23
(base) benjamin@JieDev:~/WorkStation$ ./sk.sh -p -dsj -op
-p -dsj -op
重点马上到来,我们先把命令给出来,随后做详细讲解
(base) benjamin@JieDev:~/WorkStation$ cat arg.txt |xargs -I {} ./sk.sh -p {} -j
-p aaa -j
-p bbb -j
-p ccc -j
下面进行讲解:
cat arg.txt
将arg.txt
的内容输出,由于后面跟了管道|
,所有内容被输入管道中,由于管道只能将其输出作为后面命令的标准输入
,无法作为后面命令的命令参数
,所以xargs
才应用而生,他就是用来补齐管道的不足,将管道输出转换为命令参数
,具体到本文,就是将arg.txt
的内容转换成sk.sh
脚本的命令(行)参数
。
那么xargs
自身的命令参数-I
是什么作用呢?官方解释如下:
-I R same as --replace=R
-i, --replace[=R] replace R in INITIAL-ARGS with names read
from standard input; if R is unspecified,
assume {}
意思是:利用xargs
接收到并输出的每一个内容取代原始命令参数
中的特定内容,原始命令参数
是xargs
之后的命令,具体到本文就是sk.sh
脚本,用arg.txt
输出的每一个内容取代sk.sh
后面命令参数中的{}
内容
注意:
xargs
的标准输入中出现的“换行符、空格、制表符”都将被空格
取代;- 当
-I
与xargs
结合使用,每一个参数命令都会被执行一次。
所以我们也可以从上面的返回结果看出,sk.sh
命令被执行了3次,因为arg.txt
有3字段的内容。
本文参考内容:
- https://www.runoob.com/linux/linux-comm-xargs.html
- http://c.biancheng.net/linux/xargs.html