![“kill | pgrep dnsspoof”和“kill `pgrep dnsspoof`”之间的区别](https://linux22.com/image/100355/%E2%80%9Ckill%20%7C%20pgrep%20dnsspoof%E2%80%9D%E5%92%8C%E2%80%9Ckill%20%60pgrep%20dnsspoof%60%E2%80%9D%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
我相信它|
用于提供程序的输出作为另一个程序的输入。所以我尝试了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
,这是没有意义的