如何在不等待整行的情况下在程序输出前添加字符串?

Hubro

我有一个脚本,该脚本使用SSH在远程服务器上运行命令。我想Remote:在输出的每一行前添加字符串,但是我不希望每行都延迟到整个行可用为止。这是我的命令的输出:

$ myproject-db-push my_database_name
从数据库导出...完成
存档数据...完成
将存档上传到远程...完成
在远程上运行安装脚本
远程:将存档解压缩到临时目录中...完成
远程:使用数据库:my_database_name
远程:删除集合:
远程:-my_collection_foo
远程:-my_collection_bar
远程:导入新数据...完成

在这种情况下,我使用的sed是这样的:

echo "$INSTALLCMD" | ssh -T "deploy@$SERVER" | sed -u "s/^/Remote: /"

正如我所解释的,问题是没有分行打印到屏幕上。如果我删除| sed零件,它会按预期工作。首先,这是这样写的:

导入新数据... 

几秒钟后,该行完成了:

导入新数据...完成

我假设sed只能逐行工作。我尝试将其设置为无缓冲,但它仍在等待整行。还有另一种方法可以做到这一点吗?

混乱

这是一个有点棘手,因为所有这些utillities( ,sedawkgrep的行缓冲。这意味着它们仅在行结束时(换行已结束)才打印输出。他们无法逐字符读取输入的字符。

因此,为了进行测试,我做了一个小的序列,该序列模拟了您的行为:

{ 
  echo -n "first task: "
  sleep 2
  echo "done"
  echo -n "second task: "
  sleep 2
  echo "done"
}

就像您的问题一样,它会first task:在2秒钟后打印出来done您可以通过在终端中进行复制来自己尝试。

解决方案:

在命令后面添加以下内容:

IFS=
command | { x=1; while IFS= read -d'' -s -N 1 char; do
  [ $x ] && printf "Remote: "
  printf "$char"
  unset x
  [ "$char" == "
" ] && x=1
done; }

解释:

read内置bash可以逐字符读取输入的字符。该部分read -d'' -s -N 1 char禁用定界符-d'',激活静默模式,-s并且一次仅读取1个字符-N 1到变量中$char然后,该命令检查变量是否$x存在。如果是,我们在新行中并打印“前缀”。然后打印字符。取消设置$x然后,最后一条语句检查字符是否为换行符。如果将换行符设置$x1和,则在下一个循环中,将打印“前缀”。

当您同时包含两个序列时,可以测试整个事情:

{ 
  echo -n "first task: "
  sleep 2
  echo "done"
  echo -n "second task: "
  sleep 2
  echo "done"
} | { x=1; while IFS= read -d'' -s -N 1 char; do
  [ $x ] && printf "Remote: "
  printf "$char"
  unset x
  [ "$char" == "
" ] && x=1
done; }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在没有加号操作的情况下在GoLang中添加字符串?

如何在不使用Javascript注释的情况下在字符串中添加双斜杠?

如何在不强制转换为字符串的情况下在整数的末尾添加两位数字?

如何在不等待其检索的情况下在C ++中获取内存位置?

如何在不等待换行的情况下在C中接受用户输入?

如何在没有循环的情况下在数组中找到匹配字符串

如何在不区分大小写的情况下在Java中拆分字符串?

如何在不切词的情况下在中间缩写字符串

如何在不引入意外空格的情况下在多行上编写f字符串?

如何在不使用FormattedMessage的情况下在ReactIntl 2.0中检索字符串

如何在不使用字符串方法的情况下在Python中去除空格?

如何在不区分大小写的情况下在mongodb中查询字符串?

如何在不使用包装器的情况下在React中渲染字符串数组?

如何在不使用getline的情况下在C ++中读取带空格的字符串

如何在不使用python中的find()的情况下在字符串中查找索引

如何在不使用字符串的情况下在Java中获得输入?

如何在没有模板函数的情况下在 Go 模板中加入字符串?

如何在字符串生成器不解释输出的情况下将'\ r \ n'添加到字符串生成器?

如何在不等待数据库添加的情况下以全日历方式添加事件

Swift:如何在不等待进程完成的情况下读取子进程中的标准输出

如何在不添加任何字符的情况下将列表合并为字符串?

如何在不使用查询字符串的情况下在所有图像上设置质量选项?

如何在不运行代码的情况下在Intellij Idea中找出静态字符串结果的连接?

如何在不使用格式码的情况下在MAC 10.10中获取OS版本字符串

如何在不使用 split 和 stringtokenizer 等函数的情况下在 java 中分离字符串?

如何在没有科学符号的情况下在Golang中将浮点数打印为字符串

如何在 C# 中不使用 RegEx 的情况下在字符串中查找 __tokens__

如何在不重复整个方法的情况下在 Java 中两次调用字符串方法?

如何在不使用REVERSE()函数的情况下在Oracle(11g)SQL中反转字符串