shell - "kill %1"失败并在脚本中打印 "No such process"

标签 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

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

经过一些故障排除后,我发现删除 2>/dev/null 时,您会看到一条错误消息:kill: No such process, < em>但是使用 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)") 严重失败。

有什么建议吗?

最佳答案

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

关于shell - "kill %1"失败并在脚本中打印 "No such process",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59008261/

相关文章:

linux - 如何在 Linux 上的 shell 脚本中获取屏幕分辨率

shell - 使用当前打开的文件作为参数从 Vim 运行 shell 脚本

Linux shell : prepend or append text to next line after matching line

MySQL 从 CSV 数据文件批量插入

linux - unix 中的 Bash Shell 脚本以 rsh 到另一台机器并执行命令

c - kill - 它会立即终止进程吗?

iOS 开发 : Is there ever a time when it's appropriate for an app to kill itself?

具有文件保存和顺序文件命名的 Linux shell 脚本

Android - 从另一个应用程序杀死应用程序(在 Root设备上)

dash-shell - 破折号相当于 bash 的大括号语法?