我有一个永远运行并定期输出内容的命令,直到它被其他东西杀死(类似于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 操作数并且没有请求除sync
、noerror
、 或之外的任何转换notrunc
,则从每个输入块返回的数据应写入单独的输出块;如果读取返回小于一个完整的块并且sync
未指定转换,生成的输出块应与输入块的大小相同。如果未指定 expr 操作数,或者请求除、 、 或bs=
之外的转换,则应处理输入并将其收集到全尺寸输出块中,直到到达输入末尾。sync
noerror
notrunc