打印到终端的末尾

时间:2016-01-28 03:46:11

标签: bash terminal

就像apt-get的这张照片一样,我怎么能在线的末尾打印一些东西,就像屏幕上的速度一样。虽然我可以像\e[C一样使用转义来使它向右移动几列并打印,但速度会有所不同而且字符串长度会有所不同。谁能告诉我怎么做?我目前正在使用bash编程。感谢。apt-get

2 个答案:

答案 0 :(得分:2)

通常,您会在环境变量COLUMNS中找到控制台窗口的宽度,但这并不完全可靠。更可靠的解决方案是使用参数tput的{​​{1}}实用程序(ncurses的一部分,但可以单独使用):

cols

分割文本的一种简单方法是使用Posix标准$ echo $COLUMNS 148 $ tput cols 148 实用程序首先打印要在填充到列宽的右边距上对齐的文本,然后输出回车符({{1} })将光标返回到行的开头,然后打印要在左边距上对齐的文本。最后,换行符将移至下一行。或者,在代码中:

printf

\r格式使用# Call it like this: # print_both_sides "This goes on the left" "and this goes on the right." print_both_sides() { printf "\r%*s\r%s\n" $(tput cols) "$2" "$1"; } 替换的标准功能来处理字段宽度和精度格式修饰符; printf表示应从参数中获取相应的数字。在这种情况下,我使用* - 即控制台窗口的宽度 - 作为格式代码*的第一个参数,它具有右边填充下一个字符串参数的效果({ {1}})在宽度恰好是控制台宽度的字段中。

如果光标当前不在左边距,我在输出的开头添加了一个回车符。

答案 1 :(得分:1)

在终端中,有多种方法可以获得实际的屏幕宽度:

  • 如果终端/连接可以成功协商屏幕大小,那么(通常)会产生stty -a中显示的正确值(columns值通常位于报告的第一行)。< / LI>
  • 命令行tput实用程序查询此信息,覆盖终端数据库中列数的任何常量值,并可以打印它,例如tput cols
  • 环境变量LINESCOLUMNS 通常覆盖全屏应用程序(包括使用curses的那些应用程序:请参阅use_env)。
  • 有时信息是错误的(参见xterm FAQ Why is my screensize not set?)。对于支持VT100-style光标位置报告的终端(也在ECMA-48 8.3.14 CPR - 活动位置报告),您可以使用resize更新stty设置并可选择更新LINESCOLUMNS

使用转义序列进行打印时,有几种不同的方法可以使用有关屏幕宽度的信息,这些信息得到广泛支持。命令行tput实用程序也可以从终端描述中检索这些内容(可能缺少特定功能):

  • 绝对光标定位,允许您将光标移动到屏幕上的特定tput cup $row $column
  • 水平光标定位,允许您将光标移动到当前行的特定列:tput hpa $column
  • 相对光标定位,允许您向左或向右(或向上或向下)移动光标,给定数量的单元格,例如tput cuf $value,以给定数量的单元格向前(向右)移动。关于这个问题,使用像这样的参数通常比重复单个动作要快tput cuf1

功能cuphpacuf通常对应于ECMA-48中的名称,并在terminfo(5)手册页中进行了描述。

要在屏幕右侧打印文本,您可以这样做:

  • 获取屏幕中的列数
  • 确定文本将使用的列数
  • 计算起始列:右边距减去文本中的列数
  • 将光标移动到起始列
  • 打印文字,例如,使用echoprintf。后者具有更大的灵活性。

如果您使用命令行printf实用程序,您可能会记住,当您想知道 width 时,不能很好地支持处理多字节字符(如UTF-8)对于给定的字符串,可移植性可能是一个问题。

进一步阅读: