jq当输出被重定向时需要一个显式过滤器的问题在整个网络上都有讨论。但是如果jq是管道链的一部分,我无法重定向输出,即使在使用显式过滤器时也是如此。
考虑:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,jq命令的原始终端中的输出是:
1
3
Run Code Online (Sandbox Code Playgroud)
但是,如果我在jq命令的末尾添加任何类型的重定向或管道,输出将变得无声:
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Run Code Online (Sandbox Code Playgroud)
第一个终端中没有输出,out.txt 为空。
我已经尝试了数百种变体,但这是一个难以捉摸的问题。唯一的解决办法我发现,通过发现mosquitto_sub和东西网(这是我在那里也发现了这个问题),是包尾,并在shell脚本JQ功能:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo …Run Code Online (Sandbox Code Playgroud) unbuffer(1) 和 stdbuf(1) 之间有区别吗?从我收集的信息来看,unbuffer 不仅仅是在开始时调用 libc 函数 set(X)buf 的“最大努力”,然后让事情发生?
我正在尝试从 发送消息kafka-console-producer.sh,即
#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
export KAFKA_HEAP_OPTS="-Xmx512M"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
Run Code Online (Sandbox Code Playgroud)
然后我通过 Putty 终端粘贴消息。在接收端,我看到消息大约被截断到 4096 字节。我在卡夫卡的任何地方都没有看到设置了这个限制。
这个限制可以来自 bash/terminal 或 Putty 吗?
我记得在某处读到过(然后我忘记了在哪里)关于一种很少使用的 bash 管道类型,它可以逐行重定向输出。换句话说,不是在最后重定向一次输出,而是为每个换行符重定向输出,并多次运行接收过程。我已经查看了所有我可以获得的 bash 文档,但我无法弄清楚这个“管道”是否真的存在。
有逐行管道之类的东西吗?当然,这项任务可以通过其他方式轻松完成,但我很好奇是否有更优雅的方式。
我正在获取一个脚本的输出,然后将此输入传递给 grep 并将 grep 的输出传递给另一个脚本:
./script1 | grep 'expr' | ./script2
Run Code Online (Sandbox Code Playgroud)
但是,第二个脚本永远不会得到任何输入。同样,没有被印刷时,我代替script2用cat和script1有ping:
ping localhost | grep localhost | cat
Run Code Online (Sandbox Code Playgroud)
如果我替换grep为awk:
ping localhost|awk '{print $1}'|cat
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?