"kill %1"失败并在脚本内打印"No such process"



我目前正在使用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

如果您将其复制粘贴到破折号外壳中,您可以看到代码工作正常。
无论如何,如果您尝试将其保存在文件中,则不会。

经过一些故障排除,我发现删除2>/dev/null,您可以看到一条错误消息:kill: No such process使用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,但是在子壳(例如var="$(jobs -p %1)"(中jobs -p %1失败了。

有什么提示吗?

作业控制在非交互式外壳中被禁用。使用 set -m 或通过将-m附加到 shebang 来启用它,它将起作用。

例:

$ dash -c 'sleep 1 & kill %1 && echo success'
dash: 1: kill: No such process
$ dash -m -c 'sleep 1 & kill %1 && echo success'
success

最新更新