求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

sh/bash/dash/ksh/zsh等Shell脚本
回复
china_fei
帖子: 9
注册时间: 2012-07-31 14:56

求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#1

帖子 china_fei » 2012-07-31 16:34

在linux命令中能不能用一条命令实现下面的功能
1 列出gedit运行的程序(ps aux |grep gedit)
2 根据第一条命令的返回值 kill -9 3231 (假设3231为第一条命令的结果中的pid)

通常咱们写shell脚本的时候会把第一个命令采用ps aux |grep agent_image |awk /-c/'{ print $2} 赋值到一个变量上,但是我现在不想使用变量,就是想直接让一条命令直接使用另外一条命令的结果。。。

求大腿,求大神,求赐教!!!
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#2

帖子 lilydjwg » 2012-07-31 16:45

代码: 全选

kill -9 $(ps aux |grep agent_image |awk /-c/'{ print $2})
话说一开始就用 9 号信号,真心狠手辣啊。
china_fei
帖子: 9
注册时间: 2012-07-31 14:56

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#3

帖子 china_fei » 2012-07-31 16:53

#!/bin/sh
res=`kill -9 $( ps aux |grep gedit |awk /-c/'{ print $2}')`

额,神,貌似不对。。。 我试着kill gedit 你在本地试试
不过依然感谢
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#4

帖子 lilydjwg » 2012-07-31 17:02

china_fei 写了:#!/bin/sh
res=`kill -9 $( ps aux |grep gedit |awk /-c/'{ print $2}')`

额,神,貌似不对。。。 我试着kill gedit 你在本地试试
不过依然感谢
那是因为你给的命令不对。应该是:

代码: 全选

#!/bin/sh
kill -9 $(ps aux |grep gedit |awk '{print $2}')
`xxx` 和 $(xxx) 是等价的。
china_fei
帖子: 9
注册时间: 2012-07-31 14:56

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#5

帖子 china_fei » 2012-07-31 18:03

果然是神。。。。
不过,额,神可不可以再问下
这个东西运行之后会出现 bash: kill: (5660) - 没有那个进程
虽然不影响我 上来就9信号的目的。。。
你能给我解释下么,谢谢大神。。。。 :em01
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#6

帖子 lilydjwg » 2012-07-31 18:36

china_fei 写了:果然是神。。。。
不过,额,神可不可以再问下
这个东西运行之后会出现 bash: kill: (5660) - 没有那个进程
虽然不影响我 上来就9信号的目的。。。
你能给我解释下么,谢谢大神。。。。 :em01
「没有那个进程」就是说没有你要找的进程嘛。
后边的没看太懂……
cao627
帖子: 992
注册时间: 2007-12-05 10:57
系统: ubuntu14.04
来自: 金山

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#7

帖子 cao627 » 2012-07-31 19:50

代码: 全选

ps aux |grep gedit |awk '{print $2}'
命令本身会启动一个grep 进程,该进程在用ps aux命令显示其条目时也包含gedit(gedit做为grep参数会被ps aux显示到),但当整个ps aux |grep gedit |awk '{print $2}'命令的运行结果作为kill命令的参数时,grep进程已经结束了。所以kill命令找不到这个进程号了。
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#8

帖子 aerofox » 2012-07-31 20:52

对于你这个特定的任务,无需又是命令扩展又是管道的,直接用现成的命令更方便,pkill、skill、killall 都适合。
china_fei
帖子: 9
注册时间: 2012-07-31 14:56

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#9

帖子 china_fei » 2012-07-31 22:55

神,我自己又想了一个

ps aux | grep gedit |colrm 1 9|colrm 6|xargs kill -9
如果想只删除头一个进程的话
ps aux | grep gedit | head -n 1 | colrm 1 9 | colrm 6 | xargs kill -9

正确执行。。。。

我上面说的那个bash:kill....没有那个进程

我觉得7楼的解释是正确的。

谢谢大家的关注,谢谢各位大神的帮忙.
noc_ken
帖子: 12
注册时间: 2009-12-05 8:35

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#10

帖子 noc_ken » 2012-08-01 10:18

反引号:执行命令,后使用AWK返回PID号,可以不用使用$()方式,fedora 16 x86-64,bash 4.2.10 awk4.0执行有效
kill -9 `ps aux | grep gedit | awk '$11 !~ /grep/{print $2}'`

(PS:$11是COMMAND所在的FIELD区域,这样可以避免出现grep的进程号,话说我一个用FEDORA来UBUNTU这里游荡会不会被人打。。。)
上次由 noc_ken 在 2012-08-01 10:24,总共编辑 1 次。
funicorn
帖子: 1318
注册时间: 2005-09-13 4:56
系统: Ubuntu Jammy Jellyfi

Re: 求神腿。。。。Shell脚本中如何使一条命令实现两条命令的功能(如下)

#11

帖子 funicorn » 2012-08-01 10:21

man pkill
回复