在 shell 命令输出上执行命令

在 shell 命令输出上执行命令

我有一个永远运行并定期输出内容的命令,直到它被其他东西杀死(类似于tail -f),并且我想这样做,以便每当有新输出时都会执行另一个命令。

注意事项:

  • 我无法使用 Bash
  • 该命令显然不是tail,它只是以类似的方式运行
  • 该命令的输出并不总是按行出现,并且我不打算为输出的每一行执行其他命令
  • 轮询不是可接受的解决方案

答案1

以下是每当从 stdin 读取内容时触发 shell 命令的示例dd,无论是否由换行符终止:

{
   printf not-nl-terminated
   sleep 1
   printf '%s\n' nl-terminated
   sleep 1
   echo
   sleep 1
   printf 'binary\0data'
} | 
while : ; do
   input=$(dd bs=1M count=1 2>/dev/null | tr '\n\0' __)
   [ "$input" ] || break
   printf 'input of size %d\n' "${#input}" 
done

会给

input of size 17
input of size 14
input of size 1
input of size 11

此片段来自标准规格明确使用时可能有助于理解dd的行为:bs=

如果bs=指定了 expr 操作数并且没有请求除syncnoerror、 或之外的任何转换notrunc ,则从每个输入块返回的数据应写入单独的输出块;如果读取返回小于一个完整的块并且sync未指定转换,生成的输出块应与输入块的大小相同。如果未指定 expr 操作数,或者请求除、 、 或bs= 之外的转换,则应处理输入并将其收集到全尺寸输出块中,直到到达输入末尾。syncnoerrornotrunc

相关内容