Bash 杀死eval';电沉积过程

Bash 杀死eval';电沉积过程,bash,eval,kill,Bash,Eval,Kill,就拿这个脚本来说,仅仅是一个例子 #/垃圾箱/垃圾箱 foo() { 评估“$@” } 触摸栏 foo-tail-f条& 睡眠1 杀死美元! 在这个例子中,我想杀死tail,但是因为tail是作为eval的结果调用的,所以它不会被杀死。如果不使用pgrep,pkill等,我怎么能杀死tail呢?使用exec应该可以 #/垃圾箱/垃圾箱 foo() { 执行官“$@” } 触摸栏 foo-tail-f条& 睡眠1 杀死美元! 如果与管道一起使用,则需要进行流程替换 foo tail -f ba

就拿这个脚本来说,仅仅是一个例子

#/垃圾箱/垃圾箱
foo()
{
评估“$@”
}
触摸栏
foo-tail-f条&
睡眠1
杀死美元!

在这个例子中,我想杀死
tail
,但是因为
tail
是作为
eval
的结果调用的,所以它不会被杀死。如果不使用
pgrep
pkill
等,我怎么能杀死
tail
呢?

使用
exec
应该可以

#/垃圾箱/垃圾箱
foo()
{
执行官“$@”
}
触摸栏
foo-tail-f条&
睡眠1
杀死美元!
如果与管道一起使用,则需要进行流程替换

foo tail -f bar > >(tee baz) &

这是因为,当你
杀死$,实际上是子shell(foo&),它被
SIGTERM
杀死。您没有终止
tail
命令

正如svnpenn所提到的,使用
exec
,子shell的PID由
tail
继承

或使用以下代码进行树遍历:

kill `ps -C tail --ppid $! -opid=`

它将列出pid为$的所有尾部进程(
-C tail
)!(
--ppid$!
)&仅打印其PID
-opid=
&然后删除该PID。

您试图解决的实际问题是什么?你在这里同时做了几件没用的事。