bash - 在不使用文件的情况下连续组合两个同时运行的 shell 命令的输出行
问题描述
我有两个应该同时运行的命令。当被某物触发时,它们都会输出一行文本。当其中一个输出某些内容时,我想连续打印格式化为单行的这些命令的输出。
例如,如果第一个命令输出(注释不是输出的一部分,只是它的顺序):
One # 1
Two # 5
Three # 6
第二个输出:
Aaa # 2
Bbb # 3
Ccc # 4
Ddd # 7
我想得到:
One -
One - Aaa
One - Bbb
One - Ccc
Two - Ccc
Three - Ccc
Three - Ddd
基本上,当任何命令输出一行时,我想用另一个命令输出的最后一行打印这一行,格式化。
我试图做这样的事情:
#!/bin/bash
out1=''
out2=''
output() { printf "%s - %s\n" "$out1" "$out2"; }
command1 | while read -r out1; do output; done &
command2 | while read -r out2; do output; done &
wait
但似乎并行 bash 函数无法访问全局变量,现在我考虑一下这是有道理的。通过将命令的输出重定向到文件来做到这一点很简单,但我不想不断地将数据写入磁盘。有没有办法在不使用文件的情况下做这样的事情?
PS 这些程序是i3status和akd。我想使用akd -p
选项不断将当前键盘布局打印到标准输出,并将其与通常的 i3status 输出结合起来形成 i3bar 的状态行。
解决方案
我想到了:
#!/bin/bash
layout=''
i3status=''
{ i3status & akd -p
} | while read -r line
do
if [[ $line == * ]]; then
i3status=$line
else
layout=$line
fi
printf "%s | %s\n" "$layout" "$i3status"
done
pkill -P $$
有一个小问题 - i3status 的输出变为无色,但我认为可以使用 JSON 输出修复。无论如何 - 这超出了这个问题的范围。感谢@markp-fuso 的建议。
PS 方括号内的不可打印字符是 font-awesome 的 wifi 符号。它始终是 i3status 输出的第一个字符,这就是我区分行的方式。另一种方法是使用字符串的长度 -akd -p
总是打印两个字符并且i3status
总是打印更多。
推荐阅读
- python - Python 三引号和百分比 (%) 语法
- javascript - 在第一次和第二次出现正斜杠之间替换字符串
- javascript - 动画 javascript div 上的文本
- reactjs - ReactJS material-ui 'TypeError: onSelect is not a function' tabHandler
- python - 是否可以在 Dask 中为特定任务选择工人?
- c - C:管道:如何正确使用管道传递动态 int 数组
- python - 尝试将我的文件推送到 heroku 时出现错误“git push heroku master ERROR”
- reactjs - 提交发布请求并在邮递员中工作时,仅在 reactjs 中出现 CORS 策略错误
- php - htaccess 重定向文件夹以防止直接访问
- python - 用管道填充某些列缺失值后,无法从数据框中删除