BASH – 来自pipe道的怪异字符

我有这个脚本,只是杀死一个应用程序

KEY_NAME=/some/path kill `ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'` exit 0 

如果我手动编写kill命令作为一个oneliner而不是它的工作。 但是我必须把它作为一个不起作用的脚本来运行。 所以我试图debugging它,这是结果

 [user@server logs]$ bash -x ./script.sh + KEY_NAME=/some/path ++ ps -ef ++ grep /some/path ++ grep -v grep ++ awk '{ print $2 }' + kill $'20557\r' : arguments must be process or job IDs + exit 0 

为什么我一直在kill线上得到那些奇怪的angular色? 我怎样才能摆脱他们?

可能是这样的情况是,返回的pid的数量超过1更改您的行

 ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }'|xargs kill 

你得到乱码字符的原因可能是(我无法验证它,因为我没有访问你的环境),由于subshel​​l返回多个行。

尝试这个:

 KEY_NAME=/some/path for pid in $(ps -ef | grep $KEY_NAME | grep -v grep | awk '{ print $2 }') do kill $pid done exit 0 

你可以用pkill调用来替换所有的。 使用-f选项,完整的命令行用于匹配(不只是进程名称),因此您仍然可以匹配路径。

 pkill -f $KEY_NAME 

除了更简单之外,它还使您更容易控制要杀死的内容,例如仅杀死特定用户/组拥有的进程,或只杀死最旧/最新的进程。