了解如何将输入发送到 Bash 中的管道

ajs*_*sie 17 linux bash

我不太明白管道在 bash 中是如何工作的。

我知道它将一个命令的输出作为另一个命令的输入。

我能得到什么输出,因为它是命令打印到屏幕上的。

但是我怎么知道一个命令会接受什么输入呢?

这是我认为可行的示例:

which gem | rm
Run Code Online (Sandbox Code Playgroud)

不幸的是它没有。

哪个 gem 打印出来,/usr/bin/gem所以必须是正确的输出?

我认为那是给 rm 的,所以它会是,rm /usr/bin/gem但我错了。

所以我的问题是,我怎么知道命令需要什么输入?

Bor*_*lid 23

“输入”和“命令行参数”是不同的东西。

rm 删除作为参数提供的文件。

管道将左侧命令的输出重定向到右侧命令的输入。它不会影响右侧程序的命令行参数。

要执行您要执行的操作,请尝试使用xargs将标准输入转换为用于执行程序的命令行参数。这就是它的工作。

which gem | xargs rm例如,将删除gemPATH 中的 。


Tyl*_*nry 12

rm不接受输入,它接受参数。这些是不同的。参数是您在命令行上提供给程序以影响其行为的开关和文件名等。输入是程序处理的数据。例如,同时grep接受输入和参数:

grep "foo" file.txt
Run Code Online (Sandbox Code Playgroud)

那里有两个参数"foo"file.txt。该输入内容file.txt,不是字符串file.txt本身。由于 grep 接受输入,您可以将其与管道一起使用:

cat file.txt | grep "foo"
Run Code Online (Sandbox Code Playgroud)

产生相同的输出,因为猫正在file.txt作为参数,并产生内容file.txt作为输出。然后将该输出通过管道传送到 grep,产生与 grep 打开文件本身相同的效果,如第一个示例所示。

如果你想使用一个程序的输出作为另一个程序的参数,你可以使用反引号:

rm `which gem`
Run Code Online (Sandbox Code Playgroud)

或此替代(特定于 bash 的)语法:

rm $(which gem)
Run Code Online (Sandbox Code Playgroud)

编辑:或者xargs正如另一个回答者指出的那样。使用命令行给猫剥皮的多种方法。

  • @ajsie:如果您在程序名称之后和按 Enter 键之前键入它,则它是一个参数。如果您在程序开始运行后将其键入到程序中,则它是标准输入。 (8认同)