这就是我想做的
while ["ps a | grep '[m]ono' | awk '{print $1}'" != ""] ; do
kill ps a | grep '[m]ono' | awk '{print $1}'
done
意味着如果 grep 没有返回任何内容,则不要尝试杀死。
问题是我总是对 bash 中的表达式求值感到困惑,有时我在某些东西周围使用 ""
,有时是 eval
,有时是 ''
.
有人可以向我解释如何在循环中编写条件并解释上述之间的区别吗?我习惯于通过多次尝试才能找到可用的方法,这感觉就像浪费了巨大的时间。
最佳答案
最佳选择:做点别的事情。
已经存在用于此目的的实用程序。示例:
-
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}')" != "" ]
$(...)
的内容替换为其中命令的输出;因此,运行管道并将其输出与空字符串进行比较。
关于bash - 尝试终止 bash 中的进程 - [...] 中嵌入的代码未运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744187/