【发布时间】:2013-06-18 21:59:57
【问题描述】:
我正在尝试在 Cygwin 中运行一个 shell 脚本,但在将变量传递给子 shell 时遇到问题!
我有一个非常简单的脚本,它实际上获取进程的 PID,我想从那里终止脚本中的进程。
# my_proc_kill.sh
#
export c=$(ps -W | grep -ir behave | sed 's/\([0-9]\+\).*/\1/')
echo $c
#1
/bin/kill -f $c
#2
sh -c '/bin/kill -f ${c}' "$c"
#3
sh -c '/bin/kill -f $@' _ "$c"
#4
e=$(taskkill /PID $c)
我尝试以四种不同的方式终止该进程,但都没有奏效!
我不知道为什么 (#1) 和 (#4) 如果我直接在 Cygwin 终端中调用它们就可以正常工作,但在我运行“my_proc_kill.sh”时却不行。
我注意到的另一件事是,对于 (#4),如果我将“$c”替换为实际的进程号,然后运行“my_proc_kill.sh”,那么它将起作用。所以,看起来变量值“$c”没有传递给“taskkill”! 如何修改代码,以便 taskkill 知道变量“$c”?!?
但不应该为特定进程固定 PID,只要我没有杀死该进程,不管我正在访问哪个 shell 进程 ID?
请告知如何解决这个问题?
这是我在运行脚本时收到的错误消息:
5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid:
ERROR: Invalid query
为什么“kill”将其视为非法 pid? 但是当我在 Cygwin 终端中使用相同的 PID 号(在本例中为 5040)时,它可以工作吗? (以下是可以的)
$/bin/kill -f 5040
知道如何解决这个问题吗?
提前致谢。
【问题讨论】:
-
1.将
echo $c替换为echo .$c.以确保 $c 不包含空格左右。 2. kill -f 是什么意思?在我的 ubuntu 10 上未知。 3.ps -W | grep -ir behave...不也打印 grep 的 pid 吗? 4. 为什么是grep -r? 5. ps -W 是什么? -
我认为这些不是问题。因为在脚本中我只是将 $c 替换为实际的 PID 号(对于我的情况是 5040),我仍然得到与以前完全相同的错误。换句话说,我将脚本更改为 (/bin/kill -f 5040) 仍然是一样的东西。我也试过(/bin/kill/5040)还是同样的错误。但是当我在 Cygwin 命令行中键入这个精确的表达式 (/bin/kill -f 5040) 时,它会终止进程,并且一切看起来都很好。