我有以下代码:
while ...
echo -n "some text"
done | while read; do
echo "$REPLY" >> file
done
但是echo只有在没有" -n"旗。 看起来像使用-n时,输出不会被循环
下次刷新/读取我如何确保"某些文字"即使没有EOL,也会被阅读?
答案 0 :(得分:4)
你无法区分
echo -n "some text"
和
echo -n "some t"
echo -n "ext"
因此您需要某种分隔规则。通常使用EOL。 read
通过-d支持自定义分隔符,或者可以通过-n或-N基于字符数进行分割。例如,您可以在每个符号上触发read
:
echo -n qwe | while read -N 1 ch; do echo $ch; done
答案 1 :(得分:1)
您可以从定义自己的分隔符开始:
while :; do
echo -n "some text"
sleep 2
done | while read -d' ' reply; do
echo "-$reply-"
done
打印:
-some-
-textsome-
-textsome-
对于电子邮件,也许将.
用作分隔符是有意义的,但您需要决定一些标记化方案。
答案 2 :(得分:1)
解决方法是(按照原始示例):
while ...
echo -n "some text"
done | (cat && echo) | while read; do
echo "$REPLY" >> file
done
这会将EOL附加到测试流&允许read
阅读。
副作用将是流结束时的额外EOL。
答案 3 :(得分:0)
您可以让read
一次读取一个字符,但应该添加一些内容来读取特殊字符(换行符,空格):IFS=
。
我想表明我真的捕捉到了这些角色,所以我会将回复大写。
i=0
while (( i++<5 )) ; do
echo -n "some text $i. "
sleep 1;
done | while IFS= read -rn1 reply; do
printf "%s" "${reply^^}"
done
此解决方案有一个功能:您不会看到任何换行符。 当你想要看到它们时,你需要用
解决这个问题i=1
while (( i++<5 )) ; do
echo -n "some text $i.
second line."
sleep 1;
done | while IFS= read -rn1 reply; do
if (( ${#reply} == 0 )); then
echo
else
printf "%s" "${reply^^}"
fi
done