繁体   English   中英

bash 脚本将输入参数与管道 xargs 参数连接起来

[英]bash script concatenates input arguments with pipe xargs arguments

我正在尝试执行我的脚本,但 $1 参数与最后一个管道的参数连接,导致以下结果

killProcess(){   
 ps aux |grep $1 | tr -s " " " " | awk "{printf \"%s \",\$2}" | tr " " "\n" | xargs -l1 echo $1
}
$killProcess node
node 18780
node 965856
node 18801
node 909028
node 19000
node 1407472
node 19028
node 583620
node 837
node 14804
node 841
node 14260

但我只想要pids列表,没有节点参数能够删除它们,只有当我把它放在脚本下时才会发生,在命令行中它对我来说正常工作,因为我没有将任何参数传递给脚本它不会被连接起来。

直接的问题是你不想要最后的$1 在这种情况下, $1扩展为函数的第一个参数(在您的示例中为“node”),然后将其传递给xargs并被视为它应该执行的命令的一部分。 也就是说,管道的最后一部分扩展为:

xargs -l1 echo node

...所以当xargs接收“18780”作为输入时,它会运行echo node 18780 ,这当然会打印“node 18780”。

解决方案:删除$1 ,使命令只是xargs -l1 echo ,所以当 xargs 接收“18780”作为输入时,它运行echo 18780echo 18780打印“18780”。

这会解决它,但也有大量的简化可以在这里完成。 管道的许多元素没有做任何有用的事情,或者彼此交叉工作。

从管道中的最后一个命令xargs 它接收PID,每行一个,并每行打印一个。 它根本没有做任何事情(无论如何我都可以看到),所以就不要再管了。 (当然,除非您真的想使用kill而不是echo —— 在这种情况下,请保持打开状态。)

现在从最后看接下来的两个命令:

awk "{printf \"%s \",\$2}" | tr " " "\n"`

在这里, awk在每个 PID 后面打印一个空格,然后tr将空格转换为换行符。 为什么不让awk以换行符开头打印每个? 为此,您甚至不需要printf ,您可以只使用print因为它会自动添加换行符。 将脚本以单引号传递给awk也更简单,因此您不必转义双引号、美元符号和(可能)反斜杠。 所以这些都可以工作:

awk "{printf \"%s\\n\",\$2}"
awk '{printf "%s\n",$2}'
awk '{print $2}'

当然,我推荐最后一个。

现在,关于awk之前的命令: tr -s " " " " 这将空格运行“挤压”为单个空格,但这不是必需的,因为awk将空格运行视为(单个)字段分隔符。 所以,再一次,把这个命令排除在外。

在这一点上,我们归结为以下管道:

ps aux | grep $1 | awk '{print $2}'

这里还有两件事我要推荐。 首先,您应该(几乎)始终在 shell 变量、参数等引用(如$1周围使用双引号。 因此,请改用grep "$1"

但是不要那样做,因为awk完全有能力进行搜索; 不需要grepawk 事实上, awk可以更精确,只搜索特定字段而不是整行。 缺点是,它做起来有点复杂,但知道如何让awk做更复杂的事情是有用的。 awk与 shell 变量或参数一起工作的最好方法是使用它的-v选项来创建一个具有相同值的 awk 变量,然后使用它。 然后,您可以使用~来检查与变量的正则表达式匹配。 像这样的东西:

awk -v proc="$1" '$11 ~ proc {print $2}'

注意:我假设您想在可执行文件名称中搜索$1 ,这是您系统上ps aux的第 11 个字段。 仅搜索该字段将使其不匹配例如用户名(杀死用户的所有进程,因为他们的名称包含一些程序名称是不礼貌的)。 您实际上可能想要更具体,以便例如尝试杀死node也不会意外杀死nodemon 这将是使用更具体的搜索模式的问题。

所以,这是最终的结果:

killProcess(){
    ps aux | awk -v proc="$1" '$11 ~ proc {print $2}'
}

要真正xargs -l1 kill进程,请在最后添加xargs -l1 kill

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM