Shell &引用;杀死%1“;失败并打印“;没有这样的程序”;内文

Shell &引用;杀死%1“;失败并打印“;没有这样的程序”;内文,shell,kill,dash-shell,Shell,Kill,Dash Shell,我目前使用dash作为主外壳。 我试着写一个小函数来模拟等待,但是有一些文本 下面是一个最低限度的工作代码: #!/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 Resum

我目前使用dash作为主外壳。
我试着写一个小函数来模拟等待,但是有一些文本

下面是一个最低限度的工作代码:

#!/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-this-process
,但是使用
命令wait“${pid}”
它只是等待它

例如:

#!/bin/dash

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

main() {
  sleep 3 &
  wait %1
}

main
也可以作为文件脚本使用

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

在这些试验中,我试图将
%1
转换为其pid,但子shell中的
作业-p%1
(例如
var=“$(作业-p%1)”
)严重失败

任何提示?

在非交互式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

使用实际的PID(
wait$!
)而不是像%1这样的作业规范,它甚至可以在没有交互扩展的情况下编译shell时工作。@Charles为非交互shell启用作业控件有什么注意事项吗?@oguzismail,只有对基线POSIX标准具有可选用户可移植性实用程序扩展的shell才支持作业控制。我完全可以想象一个小型的busybox构建或者不包含它们的构建。