在bash中,我可以使用%+
或%%
来参考上一个职位,但我无法在/bin/sh
中执行此操作。
考虑以下脚本:
#!/bin/[ba]sh
some_job() {
sleep 1
sleep 1
sleep 1
sleep 1
sleep 1
sleep 1
}
some_other_job() {
sleep 1
}
echo "some_job"
some_job &
echo "some_other_job"
some_other_job &
echo "sleep"
sleep 2
kill %1
jobs -l
使用bash
运行它很好,但是使用sh
执行它会给我一个错误。
$ ./mwe.sh
some_job
some_other_job
sleep
./mwe.sh: 25: kill: No such process
[2] + 2446 Done
[1] + 2445 Running
$ ps
PID TTY TIME CMD
2445 pts/0 00:00:00 mwe.sh
2453 pts/0 00:00:00 sleep
2494 pts/0 00:00:00 ps
3587 pts/0 00:00:01 zsh
如何在/bin/sh
中引用作业?
答案 0 :(得分:2)
更新:POSIX kill
accept job ids;他们只是在概要中没有提到。 Leon's answer也是正确的。
POSIX kill
仅适用于流程ID,而不适用于jobspecs。您必须明确记录要杀死的作业的进程ID。
# [ function definitions deleted.]
echo "some_job"
some_job & to_kill=$!
echo "some_other_job"
some_other_job &
echo "sleep"
sleep 2
kill "$to_kill"
jobs -l
答案 1 :(得分:2)
尝试通过以下方式之一启用作业控制:
#!/bin/sh -m
set -m
添加为脚本的第一个命令这两种方法对我有用(使用dash
作为/bin/sh
)。
答案 2 :(得分:1)
据我所知,香草Bourne Shell不支持工作控制。