xargs
我在和命令方面遇到了麻烦pipe
。这是一个例子 =
echo 'a' | xargs mkdir
该命令创建一个名为 的目录a
。所以我可以理解这个命令相当于mkdir a
但为什么这个命令不起作用= echo 'a' | mkdir
?
我读到该pipe
命令将左命令的输出作为输入传递给右命令,而| xargs
命令将左命令的输出作为参数传递给右命令。
1-输入和参数之间有什么区别?
2-echo 'a' | mkdir
为什么这个命令不起作用以及这个命令的等效项是什么?
谢谢...
答案1
简单回答
参数是输入。
更长的答案
还有其他类型的输入。
在您的示例中,echo 'a' | mkdir
您希望mkdir
读取其标准输入。然而,mkdir
并没有编写这样做。
您所说的输入是标准输入(stdin
)。输出为标准输出 ( stdout
)。全部存在标准误 ( stderr
)。和退出代码。
甚至更长的答案——那么有什么区别呢?
参数必须在程序启动之前可用。它通常是: 短;包含选项、文件名和短文本。
标准输入可以在程序运行时写入;可以向其发送程序启动时不存在的数据;不保证可以乱序读取(所以按顺序读取);可以是任意长度;如果您需要更多发送文件名作为参数,每个进程只有一个标准输入;
echo 'a' | xargs mkdir
没有怎么办xargs
mkdir "$(echo 'a')"
这些$()
方法运行包含的命令,然后$()
用该命令的标准输出替换 及其内容。
答案2
我也曾为此困惑过很长一段时间。我将举一个可能稍微简单一点的例子(我到目前为止还不是 bash 专家):
wc "test"
wc <<< "test" (same as: echo "test" | wc)
这两者的结果是非常不同的。第一个尝试读取文件test
,第二个显示1 1 5
。
这里的问题是wc "test"
得到争论 "test"
作为输入,而wc <<< "test"
需要标准输入。
因此,当您发出echo 'a' | xargs mkdir
(xargs代表:作为参数执行)时,您正在传递一个争论到mkdir
;这就像做:mkdir a
。
另一方面,当您发出echo 'a' | mkdir
(更简单的是mkdir <<< 'a'
:)时,您将a
作为标准输入传递。
mkdir
对待这些事情的方式非常不同,因此你看到的结果是不同的。