“kill | pgrep dnsspoof”和“kill `pgrep dnsspoof`”之间的区别

“kill | pgrep dnsspoof”和“kill `pgrep dnsspoof`”之间的区别

我相信它|用于提供程序的输出作为另一个程序的输入。所以我尝试了kill | pgrep dnsspoof但没有成功。所以我尝试了

kill `pgrep dnsspoof`

它起作用了。有人能告诉我这些命令在内部是如何工作的吗?

答案1

|您将一个程序的输出提供给另一个程序是正确的。数据left流向right.所以你可能会认为

pgrep dnsspoof | kill

应该可以工作,因为pgrep会找到 dnsspoof 的进程号并将其提供给kill,然后将其杀死。事实证明这是行不通的,因为 Kill 只查看命令行来获取要杀死的东西。

所以我们必须将输出输出pgrep到命令行上。这就是 `pgrep dnsspoof` 或更现代的$(pgrep dnsspoof)做法,它在反引号或括号内运行命令,并将输出放在命令的位置。因此,如果pgrep dnsspoof输出5432,则运行的命令是kill 5432,这是调用 Kill 程序的正确方法。

使用$( )有几个优点,更容易嵌套,需要转义的东西更少,所以如果你的 shell 支持它们,那么你应该优先使用它们` `

答案2

您是对的,|但您正在以相反的方式运行命令,您应该运行 pgrep dnsspoof然后将其输出发送到输入kill,但它不接受标准输入上的命令,他们希望在命令的参数中拼写出来,因此您必须使用xargs它读取 STDIN 流数据并将每一行转换为命令的空格分隔参数:

pgrep dnsspoof | xargs kill

但以你的方式,你将命令的输出发送kill为输入pgrep dnsspoof,这是没有意义的

相关内容