Linux" echo -n"没有被冲洗

时间:2018-05-01 08:47:40

标签: linux bash

我有以下代码:

while ...
  echo -n "some text"
done | while read; do
  echo "$REPLY" >> file
done

但是echo只有在没有" -n"旗。 看起来像使用-n时,输出不会被循环

下次刷新/读取

我如何确保"某些文字"即使没有EOL,也会被阅读?

4 个答案:

答案 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