我不太明白管道在 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正如另一个回答者指出的那样。使用命令行给猫剥皮的多种方法。
| 归档时间: |
|
| 查看次数: |
7613 次 |
| 最近记录: |