【问题标题】:Bash print informations on the same pointBash 在同一点上打印信息
【发布时间】:2015-04-03 16:24:49
【问题描述】:

在 bash 中如何在同一点上打印信息???

例如,如果我想遍历假设根目录的所有子目录中的所有文件,并且我想在终端上打印所有信息总是在同一位置而不打印新行,我该怎么办??

目录示例

--> root
   --> Dir 1
     --> File 1
     --> File 2
   --> Dir 2
     --> File 3
     --> File 4

shell 输出必须是这样的:

Infos before that I don't want to clear

-------------------------------
Directory    : dirName
File count   : x
File         : fileName
-------------------------------

“计数”将根据当前目录保持不变,但其他信息必须根据循环的当前子目录(元素)进行更改

提前致谢

【问题讨论】:

  • 在每次迭代中做一个“清除”并打印整个事情怎么样?
  • 如果这不是一个选项,那么您可以使用终端的 terminfo 代码在每次打印之前定位光标。
  • 如果都在一行上,那么只需使用\r 而不是\n(可能使用printf,除非你想深入了解echo 中的echo 的奥秘bash) .如果它如图所示在多行上,您必须更加努力。您也可以调查tput 命令;低级但有效。
  • 我不能只做一个“清除”,因为我在要动态更改的块之前有一些有用的信息

标签: bash shell printf echo


【解决方案1】:

考虑以下示例:

for file in *
do
  printf "\r%${COLUMNS}s\r%s" "" "$file"
  sleep 1
done
echo

这会在同一行打印当前目录中的所有文件,在每个文件名之后休眠一秒钟。

在本例中,printf 用于打印一个空参数,其字段宽度对应于终端的列。这是为了在打印每个新的 $file 之前清除该行中的任何先前输出。

【讨论】:

  • 您不认为使用文件作为变量是一个糟糕的选择吗?文件本身是一个返回文件信息的命令。
  • @Jahid:在 Bash 中这不是问题,因为变量的赋值和使用在语法上是明确的(file=value$file)。此外,与其他语言相比,几乎每个名称都可以作为命令存在。我怎么知道有例如在某个系统上没有myfilef 命令(记住命令可以是内置、别名、函数或外部程序)?
猜你喜欢
  • 2022-10-17
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多