从管道读取块并为每个块执行命令

汉尼斯·兰德霍尔姆

我有一个将数据流输出到STDOUT的命令(A)。数据流很小,大多数情况下什么也不发送。我想将数据传送到另一个命令(B),该命令在读取停止阻塞时立即对读取的每个数据块(以及在读取的块中的数据中传送)立即执行命令(C)。

块的大小无关紧要,并且可以是任何有意义的大小。本质上,我需要xargs但没有定界符,相反,只要读取开始阻塞,它就应该执行命令。

具体来说,对我来说,命令A是“ tail -f logfile”,命令C是“ hexdump -C”。我之所以不能直接通过管道传递给“ hexdump -C”,是因为hexdump一直等到读取完整的16个字节后才打印新行。因此,我想改为对每个读取的块都执行命令。

PSkocik

read如果管道不为空,Raw不会阻塞-它会返回管道中的可用字节,即使您要求更多字节也是如此。您可以利用并hexdump -C在的每次成功返回上运行read

#define _BSD_SOURCE
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define N (8*512)  //pipe size on my system as shown in `ulimit -a`
static char buf[N];

int main(){
  ssize_t nread;
  FILE* p;

  for(;;){
    do { nread = read(0, buf, N); }while (nread < 0 && errno == EINTR);
    if(nread == 0) return 0;    //EOF
    if(nread < 0) goto error; 
    p = popen("hexdump -C", "w"); if(!p) goto error;
    if(fwrite(buf, sizeof(char), nread, p) != nread) goto error;
    pclose(p);
  }

  return 0;
  error:
    perror(""); return 1;
}

您可以将其另存为,例如as shovel.c,然后make shovel(或gcc shovel.c -o shovel),然后在管道中使用它。

或者,如果您对此不感兴趣,则可以使用以下红宝石代码段做同样的事情:

tail -f file |
ruby -e 'PSIZE=8*512; 
      while(bytes = STDIN.readpartial(PSIZE));
          IO.popen("hexdump -C","w") {|p| p.syswrite(bytes) }
      end '

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在python中将图像划分为5x5块,并为每个块计算直方图

来自分类Dev

PowerShell脚本块中的命令执行顺序

来自分类Dev

在NetLogo扩展中以原语执行命令块

来自分类Dev

在Linux中查找并执行命令。是否可以通过管道2查找和执行命令

来自分类Dev

Bash在每个目录上递归执行命令

来自分类Dev

从PowerShell执行命令

来自分类Dev

如何包含使用FileUtils#sh执行命令的管道?

来自分类Dev

Salt无法通过管道或重定向执行命令

来自分类Dev

执行命令块而不将其保留在shell历史记录(zsh)中

来自分类Dev

通过父级执行命令时使用管道

来自分类Dev

在封闭的命名管道块上读取

来自分类Dev

解析并执行命令

来自分类Dev

自动执行命令

来自分类Dev

AngularJs执行命令

来自分类Dev

GIT,对每个已更改的文件执行命令?

来自分类Dev

读取Bash管道中的块中的标准输入

来自分类Dev

如何对每个文件执行命令,替换每个文件的内容?

来自分类Dev

从查询执行命令

来自分类Dev

从if块内部执行else块

来自分类Dev

如何遍历逗号分隔的列表并为每个条目执行命令

来自分类Dev

从管道块和死锁中读取

来自分类Dev

从Makefile执行命令

来自分类Dev

Bash脚本从文件读取并执行命令

来自分类Dev

创建一个命名管道/ FIFO,在读取时执行命令

来自分类Dev

执行命令块而不将其保留在外壳程序历史记录(zsh)中

来自分类Dev

bash脚本读取我的文件并执行命令

来自分类Dev

管道执行后仅执行命令,在这些情况下管道如何工作?

来自分类Dev

管道是否并行执行命令?

来自分类Dev

执行命令是 bash 并为其输出提取数据