bash脚本中的参数名冲突

时间:2013-08-04 03:11:33

标签: bash scope

我尝试模仿this answer中提供的解决方案,该解决方案找到并终止了一个进程,并开发了以下脚本,该脚本ssh到输入参数中指定的计算机列表并终止所需的进程。

for node in "$@"; do
  ssh $node "kill $(ps aux | grep '[s]omeprocess' | awk '{print $2}')"
done

$2中使用的变量awk '{print $2}'应该是grep [s]omeprocess传递的第二个参数。但是,似乎使用了整个脚本的第二个输入参数(我在这方面错了)。我可以知道我的awk '{print $2}'如何真正获得前一个grep操作传递的第二个参数吗?或者,有没有更好的方法来查找和杀死多台机器上的进程?谢谢!

1 个答案:

答案 0 :(得分:2)

$(ps ..)$2将在客户端扩展,而不是服务器端扩展。你应该逃避他们:

ssh $node "kill \$(ps aux | grep '[s]omeprocess' | awk '{print \$2}')"

但是,与pkill一样,您应该使用pkill someprocess而不是通过ps。