首页 > 解决方案 > “kill %1”失败并在脚本中打印“No such process”

问题描述

我目前使用破折号作为主外壳。
我试图编写一个应该模仿等待的小函数,但带有一些文本。

这是一个最小的工作代码:

#!/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}"它只是等待它。

例如:

#!/bin/dash

wait() {
  echo Waiting...
  local pid="${1}"; shift
  command wait "${pid}"
  echo Resuming
}

main() {
  sleep 3 &
  wait %1
}

main

也可以作为文件脚本正常工作。

我不确定这段代码在哪里/我错了,我尝试过的一些事情没有帮助。

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

任何提示?

标签: shellkilldash-shell

解决方案


作业控制在非交互式 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

推荐阅读