参考 sh 中的作业

Refere to jobs in sh

在 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 中的职位?

据我所知,vanilla Bourne Shell 不支持作业控制。

更新:POSIX kill accept job ids; they just aren't mentioned in the synopsis. 也是正确的。


POSIX kill 仅适用于进程 ID,不适用于作业规格。您必须明确记录要终止的作业的进程 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. 将您的 shebang 行更改为 #!/bin/sh -m
  2. 添加 set -m 作为脚本的第一个命令

这两种方法对我都有效(使用 dash 作为 /bin/sh)。