admin 管理员组

文章数量: 1087139


2024年4月12日发(作者:splitter文件)

linux 管道传递参数

xargs是 Unix 系统的一个很有用的命令,但是常常被忽视,

很多人不了解它的用法。本文介绍如何使用这个命令。

一、标准输入与管道命令Unix 命令都带有参数,有些命令可

以接受"标准输入"(stdin)作为参数。$ cat /etc/passwd |

grep root上面的代码使用了管道命令(|)。管道命令的作

用,是将左侧命令(cat /etc/passwd)的标准输出转换为标

准输入,提供给右侧命令(grep root)作为参数。因为grep

命令可以接受标准输入作为参数,所以上面的代码等同于下面

的代码。$ grep root /etc/passwd但是,大多数命令都不接

受标准输入作为参数,只能直接在命令行输入参数,这导致无

法用管道命令传递参数。举例来说,echo命令就不接受管道

传参。$ echo "hello world" | echo上面的代码不会有输

出。因为管道右侧的echo不接受管道传来的标准输入作为参

数。二、xargs 命令的作用xargs命令的作用,是将标准输入

转为命令行参数。$ echo "hello world" | xargs echo

hello world上面的代码将管道左侧的标准输入,转为命令行

参数hello world,传给第二个echo命令。xargs命令的格式

如下。$ xargs [-options] [mand]真正执行的命令,紧跟在

xargs后面,接受xargs传来的参数。xargs的作用在于,大

多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要

xargs将标准输入转为命令行参数。$ echo "one two three"

| xargs mkdir上面的代码等同于mkdir one two three。如

果不加xargs就会报错,提示mkdir缺少操作参数。三、

xargs 的单独使用xargs后面的命令默认是echo。$ xargs #

等同于 $ xargs echo大多数时候,xargs命令都是跟管道一

起使用的。但是,它也可以单独使用。输入xargs按下回车以

后,命令行就会等待用户输入,作为标准输入。你可以输入任

意内容,然后按下Ctrl d,表示输入结束,这时echo命令就

会把前面的输入打印出来。$ xargs hello (Ctrl + d) hello

再看一个例子。$ xargs find -name

"*.txt" ./ ./上面的例子输入xargs find

-name以后,命令行会等待用户输入所要搜索的文件。用户输

入"*.txt",表示搜索当前目录下的所有 TXT 文件,然后按下

Ctrl d,表示输入结束。这时就相当执行find -name

*.txt。

四、-d 参数与分隔符默认情况下,xargs将换行符和空格作

为分隔符,把标准输入分解成一个个命令行参数。$ echo

"one two three" | xargs mkdir上面代码中,mkdir会新建

三个子目录,因为xargs将one two three分解成三个命令行

参数,执行mkdir one two three。-d参数可以更改分隔符。

$ echo -e "atbtc" | xargs -d "t" echo a b c上面的

命令指定制表符t作为分隔符,所以atbtc就转换成了三

个命令行参数。echo命令的-e参数表示解释转义字符。五、-

p 参数,-t 参数使用xargs命令以后,由于存在转换参数过

程,有时需要确认一下到底执行的是什么命令。-p参数打印

出要执行的命令,询问用户是否要执行。$ echo 'one two

three' | xargs -p touch touch one two three ?...上面的

命令执行以后,会打印出最终要执行的命令,让用户确认。用

户输入y以后(大小写皆可),才会真正执行。-t参数则是

打印出最终要执行的命令,然后直接执行,不需要用户确认。

$ echo 'one two three' | xargs -t rm rm one two three

六、-0 参数与 find 命令由于xargs默认将空格作为分隔

符,所以不太适合处理文件名,因为文件名可能包含空格。

find命令有一个特别的参数-print0,指定输出的文件列表以

null分隔。然后,xargs命令的-0参数表示用null当作分隔

符。$ find /path -type f -print0 | xargs -0 rm上面命

令删除/path路径下的所有文件。由于分隔符是null,所以处


本文标签: 命令 参数 输入 标准 管道