参考sh的工作

时间:2016-11-02 18:00:30

标签: bash shell sh jobs

在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中引用作业?

3 个答案:

答案 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)

尝试通过以下方式之一启用作业控制:

  1. 将您的shebang行更改为 #!/bin/sh -m
  2. set -m 添加为脚本的第一个命令
  3. 这两种方法对我有用(使用dash作为/bin/sh)。

答案 2 :(得分:1)

据我所知,香草Bourne Shell不支持工作控制。