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

ing*_*oxd 3 shell kill dash-shell

我目前使用 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
Run Code Online (Sandbox Code Playgroud)

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

经过一些故障排除后,我发现删除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
Run Code Online (Sandbox Code Playgroud)

作为文件脚本也可以很好地工作。

我不确定这段代码中的错误在哪里/什么地方,并且我尝试过的一些方法没有帮助。

在试验中,我尝试转换%1为其 pid,但jobs -p %1在子 shell(例如var="$(jobs -p %1)")中失败严重。

有什么建议吗?

ogu*_*ail 5

在非交互式 shell 中禁用作业控制。使用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
Run Code Online (Sandbox Code Playgroud)