shell - “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)"
)中失败了。
任何提示?
解决方案
作业控制在非交互式 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
推荐阅读
- python - 如何根据特定元素获取列表元素的所有组合?
- c# - Signalr服务端调用服务点方法返回值
- c# - 确定给定的 url(来自字符串)是否来自我的域
- amazon-web-services - 如何以编程方式检查 Spark 步骤状态(在 EMR 集群上提交)?
- bash - ZSH:找不到命令
- sql - 选择给定专家的最后一次约会和导致它的转诊
- java - 如果 Java 中的大小已知,是否必须在“下一个”之前调用“hasNext”?
- excel - 计算重复单元格及其出现的位置
- c# - Autofac RegisterAssemblyTypes 在构造函数参数中注入 Null
- javascript - 使用参数 ReactJS 从 API 请求中获取信息