【问题标题】:gnu watch: justify on the lower left of the terminalgnu watch:在终端左下方对齐
【发布时间】:2012-02-14 23:45:25
【问题描述】:

我想每隔 N 秒对 mysql 查询应用一次 watch 命令,但希望将结果显示在终端的左下角而不是左上角:

watch -n 120 "mysql_query" | column -t"

这样显示我的结果:

--------------------------
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|                        |
|                        |
--------------------------

而我希望他们是这样的:

--------------------------
|                        |
|                        |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
|xxxxxxxxxxx             |
--------------------------

建议?

【问题讨论】:

  • 标准 watch 命令的手册页中没有任何内容表明这是可能的。祝你好运。

标签: bash watch


【解决方案1】:

我不知道watch 是否可以做到这一点,但我会使用另一种工具来拥有多个终端并根据我的需要调整运行watch 的终端的大小。

其中一些有用的工具是:

我希望这会有所帮助。

【讨论】:

  • 我已经在使用 gnu 屏幕,但在这种情况下,我希望能够将打印移出到窗口本身的左下方,而不是相对于 gnu 屏幕。
  • @avilella 我认为在screen 下运行的进程无法访问screen 运行的终端。您的屏幕不会占据整个终端窗口吗?
【解决方案2】:

我没有看到直接的方法来做到这一点,但我设法使用以下方法强制它工作。我尚未对此进行全面测试,因此我不能保证这在所有情况下都有效。

使用这个脚本:

#!/bin/bash
TERM_HEIGHT=`tput lines`  # determine terminal height
WATCH_BANNER_HEIGHT=2  # account for the lines taken up by the header of "watch"
let VIS_LINES="TERM_HEIGHT - WATCH_BANNER_HEIGHT"  # height of visible area
(yes " " | head -n $VIS_LINES; cat | head -n $VIS_LINES) | tail -n $VIS_LINES

在watch 调用时对命令的输出进行后处理,例如(假设脚本保存为align_bottom,使其可执行,并存储在您的$PATH 中的某个位置):

watch -n 120 "mysql_query | column -t | align_bottom"

脚本的作用:

  1. 确定终端的高度(行数)
  2. 计算watch输出的可见区域
  3. 打印空白行以填充输出(向下推输出)
  4. 从标准输入读入输出,并对其进行修整,以便我们仅在输出超出屏幕时显示输出的顶部。如果您想查看输出的底部,只需删除 cat 之后的 head 命令即可。
  5. tail 步骤 (3) 和 (4) 的输出,因此多余的填充被删除,最终输出正好适合 watch

我不得不承认这看起来有点老套,但希望它能让你更接近你想要实现的目标。


更新:

也应该可以将其作为一个函数来实现,以便它可以舒适地坐在.bashrc中。

function align_bottom() {
  (( VIS = $(tput lines) - 2 ))  # height of visible area
  (yes " " | head -n $VIS; cat | head -n $VIS) | tail -n $VIS
}
typeset -fx align_bottom  # !! make it callable from subshell

用法相同:

watch -n 120 "mysql_query | column -t | align_bottom"

注意watch 使用sh -c 运行给定的命令,因此,正如Dennis 在cmets 中指出的那样,在没有将/bin/sh 链接到/bin/bash 的系统上,上面显示的函数方法将不起作用。

可以使它工作使用签名:

watch -n 120 "mysql_query | column -t | bash -c align_bottom"

但为了便携性和可用性,简单地使用 shell 脚本方法会更干净。

【讨论】:

  • 在你的函数版本中,你有一个不匹配的变量$VIS_LINES应该是$VIS。当 sh 是 Bash (CentOS) 的符号链接时,(导出的)函数对我有用,但当它是 dash (Ubuntu) 的符号链接时则不行。
  • @DennisWilliamson 感谢您指出这一点。有机会我会调查的。
  • @DennisWilliamson 有什么建议吗?我无法访问带有dash a.t.m 的机器,而我唯一可以在没有系统尝试的情况下想出的是强制 bash (...| bash -c align_bottom)。
  • let 是一个 bashism,您可以将其更改为 expr 或简单的 awk 脚本。其余的似乎与 POSIX 兼容。
  • @tripleee:您可以避免使用外部实用程序并通过这样做来保持 POSIX 兼容:VIS=$(($(tput lines) - 2))。顺便说一句,当移植到其他 shell 不是问题时,在 Bash 脚本中使用“bashisms”并没有错。毕竟这个问题被标记为[bash]。在 Bash 中编写表达式的另一种方法是:(( VIS = $(tput lines) - 2 ))
猜你喜欢
  • 2013-04-19
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
相关资源
最近更新 更多