简单回答

简单回答

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对待这些事情的方式非常不同,因此你看到的结果是不同的。

相关内容