【发布时间】:2020-03-19 08:28:59
【问题描述】:
我目前使用 dash 作为主 shell。
我试着写了一个小函数,应该模仿等待,但有一些文字。
这是一个最小的工作代码:
#!/bin/dash
wait() {
echo Waiting...
local pid="${1}"; shift
local delay=.250
while kill -0 "${pid}" 2>/dev/null; do
echo Still waiting...
sleep "${delay}"
done
echo Resuming
}
main() {
sleep 3 &
wait %1
}
main
如果您将其复制粘贴到 dash shell 中,您会看到代码运行良好。
无论如何,如果您尝试将其保存在文件中,它不会。
经过一些故障排除后,我发现删除2>/dev/null,您会看到一条错误消息:kill: No such process,但是使用command wait "${pid}" 它只是在等待它。 p>
例如:
#!/bin/dash
wait() {
echo Waiting...
local pid="${1}"; shift
command wait "${pid}"
echo Resuming
}
main() {
sleep 3 &
wait %1
}
main
作为文件脚本也可以正常工作。
我不确定我在这段代码中哪里/哪里错了,我尝试的一些方法没有帮助。
在试验中,我尝试将 %1 转换为其 pid,但子 shell(例如 var="$(jobs -p %1)")中的 jobs -p %1 严重失败。
有什么建议吗?
【问题讨论】:
-
使用实际的 PID (
wait $!) 而不是像 %1 这样的作业规范,即使在没有交互式扩展的情况下编译的 shell 也可以工作。 -
@Charles 为非交互式 shell 启用作业控制有什么注意事项吗?
-
@oguzismail,只有带有可选用户可移植实用程序扩展至基线 POSIX 标准的 shell 才完全支持作业控制。我绝对可以构想出一个小型的busybox构建或不包含它们的东西。
标签: shell kill dash-shell