参考 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
尝试通过以下方式之一启用作业控制:
- 将您的 shebang 行更改为
#!/bin/sh -m
- 添加
set -m
作为脚本的第一个命令
这两种方法对我都有效(使用 dash
作为 /bin/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
尝试通过以下方式之一启用作业控制:
- 将您的 shebang 行更改为
#!/bin/sh -m
- 添加
set -m
作为脚本的第一个命令
这两种方法对我都有效(使用 dash
作为 /bin/sh
)。