试图杀死bash中的进程 - 嵌入在[...]中的代码没有运行?

时间:2015-06-09 22:52:53

标签: bash

这是我想做的事情

while ["ps a | grep '[m]ono' | awk '{print $1}'" != ""] ; do
  kill ps a | grep '[m]ono' | awk '{print $1}'
done

意思是如果grep什么都不返回,请不要尝试杀死。 问题是我总是迷失在bash中的表达式评估中,有时候我会在" "周围使用eval,有时它是'',有时它是#clickedDiv

有人可以向我解释如何在我的循环中写出条件并解释上述之间的区别吗?我习惯用很多尝试找到工作的,感觉就像是一个巨大的时间浪费。

1 个答案:

答案 0 :(得分:3)

最佳选择:做别的事。

为此目的已经存在实用程序。例如:

  • killall mono
  • pkill mono

......或者更好的是针对您要终止的特定可执行文件的内容:

  • fuser -k /path/to/something.exe

    ...只会杀死具有该特定可执行文件的文件句柄的程序,而不是机器上运行mono所有应用程序。

...但是,解释错误:

这里有两个错误:缺少命令替换和缺少空格。

  • 缺少空格:

    ["ps a | grep '[m]ono' | awk '{print $1}'" != ""]
    

    ...实际上是在尝试运行一个名称以[ps开头的命令,例如,在PATH中查找......

    /bin/[ps\ a
    /usr/bin/[ps\ a
    

    ...等。 [命令,并且在其名称后面需要一个空格,就像任何其他命令一样。因此:

    [ "ps a | grep '[m]ono' | awk '{print $1}'" != "" ]
    

    ...解决了这个问题(但另外一个问题)。

  • 缺少命令替换:

    [ "ps a | grep '[m]ono' | awk '{print $1}'" != "" ]
    

    ...正在将以"ps a"开头的字符串与""进行比较; 比较运行以ps a开头的命令的输出。要做到这一点,你可以运行:

    [ "$(ps a | grep '[m]ono' | awk '{print $1}')" != "" ]
    

    $(...)的内容被替换为命令的输出;因此,运行管道并将其输出与空字符串进行比较。