我目前正在使用破折号作为主外壳。我试图编写一个应模仿等待的小功能,但带有一些文本。
这是最小的有效代码:
#!/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
如果将其复制粘贴到破折号外壳中,则可以看到代码正常运行。无论如何,如果您尝试将其保存在文件中,则不会。
经过一些故障排除后,我发现删除2>/dev/null
,会看到错误消息:kill: No such process
,but使用command wait "${pid}"
只是在等待它。
例如:
#!/bin/dash
wait() {
echo Waiting...
local pid="${1}"; shift
command wait "${pid}"
echo Resuming
}
main() {
sleep 3 &
wait %1
}
main
也可以很好地用作文件脚本。
我不确定这段代码在哪里/什么地方出了问题,我尝试过的某些事情没有帮助。
在尝试将%1
转换为其pid的试验中,但是[subshell中的jobs -p %1
(例如var="$(jobs -p %1)"
)严重失败。
任何提示?
作业控件在非交互式Shell中被禁用。用set -m
激活它,或在shebang上附加-m
,它将起作用。
Ex:
$ dash -c 'sleep 10 & kill %1'
dash: 1: kill: No such process
$ dash -m -c 'sleep 10 & kill %1'