bash - 如何从长时间运行的命令中获取单行输入,然后将其杀死?
问题描述
有没有办法从流中获取一行输入,将其作为参数传递并终止流?
在伪 bash 代码中:
tail -f stream | filter | take-one-and-kill-tail | xargs use-value
编辑:到目前为止的实际脚本是:
i3-msg -t subscribe -m '["window"]'| stdbuf -o0 -e0 jq -r 'select(.change == "new") | "\(.container.window)\n"' | head -0
它具有以下(不良)行为:
$ i3-msg -t subscribe -m '["window"]'| stdbuf -oL -eL jq -r 'select(.change == "new") | "\(.container.window)\n\n"' | head -1
# first event happens, window id is printed
79691787
# second event happens, head -1 quits
$
解决方案
您可以在子shell 中运行该命令并杀死该shell。
在此示例中,我在第一条信息消息之后终止了流:
#!/bin/bash
( sudo stdbuf -oL tail -f /var/log/syslog | stdbuf -oL grep -m1 info ; kill $$ )
注意:( pipeline )
将在子外壳中运行管道。$$
包含当前 shell 的 pid。(即上面示例中的子shell)
在上面的示例grep -m1
中,确保在终止管道之前只读取/写入一行输出。
如果您的过滤器程序不支持这样的选项-m1
,您可以在输入的第一行之后通过管道连接到 awk 并退出 awk。其余概念保持不变:
( sudo stdbuf -oL tail -f /var/log/syslog \
| stdbuf -oL grep info \
| awk '{print;exit}' ; kill $$)
推荐阅读
- c# - 收到错误 (CS0012) 告诉我添加对 DevEx.Component.v9.1 的引用,但我已经引用了相同的组件,但 v16.1
- r - 有没有办法在 R 中使用变量来命名数据框?
- typescript - 如何在 TypeScript 中向 curried 函数添加类型?
- javascript - 在函数返回值之前比较两个值
- javascript - 你会如何找到一个 JS 函数来防止在不使用文件系统的情况下点击链接?
- c# - 聚合不同 ID 的 Linq
- javascript - 如何将 Css 属性的值(以 px 为单位的高度)作为数字存储在 Javascript 变量中?
- css - Angular 材质使用带有 flex 布局的 add_outline 按钮添加额外空间
- flask - 扩展 Flask-Security 登录模板时遇到问题
- mysql - 根据 MySQL 中其他字段中的值为字段分配值