xargs'$ 1与shell脚本中的$ 1冲突

时间:2012-11-26 16:32:17

标签: linux shell arguments xargs

我在一个shell脚本文件foo.sh中有这些行:

ps ax | grep -E "bar" | grep -v "grep" | awk '{print $1}' | xargs kill -9 $1

当我用这样的参数执行shell脚本时:

sh foo.sh arg_one

xargs现在无法正常工作。从shell脚本获取$ 1,而不是awk的输出。

我知道我可以将awk的输出存储到一个文件中,然后在xargs中使用它。

但是,还有更好的解决方案吗?

== edited ==

感谢@peterph的回答。 但是,有什么方法可以在xargs中使用1美元?

==编辑2 ==

感谢@Brian Campbell

尽管天气应该在示例中有一个无用的$ 1,如果给出了“shell脚本文件”的参数,那么xargs中的$ 1将无法按照我的意愿在我的计算机中工作(在您的计算机中,我也是认为)。 为什么?而且,如何避免它?

4 个答案:

答案 0 :(得分:3)

xargsstdin读取列表,如果您想要的是通过其PID终止进程,则只丢弃该行的最后一个$1

作为旁注,ps也可以根据命令名打印进程(在linux上使用procps查看-C选项)。

答案 1 :(得分:1)

除了那个复杂的管道外,你总是可以使用killall -9 name来杀死一个进程,或者pkill -9 pattern如果你不知道进程的确切名称但是知道一个子字符串(小心你但是,不要杀死任何非预期的进程。

要使命令正常工作,只需删除$1; xargs从标准输入中获取其参数,并运行命令行传递它在命令末尾从标准输入获得的值。

编辑(响应您的编辑):您希望xargs$1参数做什么?你有什么期待? $1唯一有任何含义的解释是传递给脚本的第一个参数。

$1脚本中的awkawk在其输入的第一列中找到的内容;然后打印出来,xargs从标准输入中获取这些值,并在命令行末尾调用您传递它的命令。因此,如果awk命令返回:

100
120
130

然后将结果传递给xargs kill -9将导致调用以下内容:

kill -9 100 120 130

您不需要像$1这样的变量来完成这项工作

答案 2 :(得分:0)

这应该有效:

ps ax | grep -E "bar" | grep -v "grep" | awk '{print $1}' | xargs kill -9

答案 3 :(得分:0)

您也可以尝试:

result=$(ps -ef | grep -E "bar" | grep -v "grep" | awk '{print $2}')
kill -9 $result

在我的情况下,即使存在匹配的进程,管道xargs有时也会返回错误:

usage: kill [ -s signal | -p ] [ -a ] pid ...
       kill -l [ signal ]
usage: kill [ -s signal | -p ] [ -a ] pid ...
       kill -l [ signal ]