bash - 尝试终止 bash 中的进程 - [...] 中嵌入的代码未运行?

标签 bash

这就是我想做的

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/

相关文章:

Bash Shell 脚本 - 对话框表单变量

bash - Shell - 删除别名中变量之前的空格

objective-c - 使用 Objective-C/Cocoa 以 root 身份运行 Bash 脚本

bash - 多行 perl 正则表达式在没有 slurp 的情况下替换大文件

bash - 音频无法在 Raspberry Pi 上使用 crontab 播放

bash - 比 format=$(printf ...) 更快的格式化字符串的方法?

ruby-on-rails - 将 RVM 与 GVim(奶油色)一起使用 : rvm command not found

linux - bash 脚本按照子目录中的模式重命名并制作副本

linux - 我们如何在 bash 中使用 for 循环将日期列表转换为 yyyymmdd 格式

regex - 如何修复此 SED 命令以查找和替换字符串