显示命令中实时值变化的 Bash 脚本

显示命令中实时值变化的 Bash 脚本

在 Linux 机器上,我有一系列命令提供不同传感器状态的数值。

这些命令的调用类似于以下内容:

$ command1
5647
$ command2
76
$ command3
8754

这些值实时变化,每次我想检查其中一个值的状态时,我都必须重新启动命令......这对我没有任何好处,因为我需要双手来操作硬件。

我的目标是制作一个简单的 Bash 脚本,它调用这些命令并保持值更新(实时异步或每 x 秒刷新一次值),如下所示:

$ ./myScript.sh
command1: x
command2: y
command3: z
command4: v

其中xyzv是变化的值。

Bash 可以简单高效地实现这一点吗?或者我应该选择使用另一种语言,比如Python?

更新更多信息:

我当前的脚本是:

#!/bin/bash
echo "Célula calibrada: " $(npe ?AI1)
echo "Anemómetro: " $(npe ?AI2)
echo "Célula temperatura: " $(npe ?AI3)
echo "Célula temperatura: " $(npe ?AI4)

npe是返回数值的示例命令。我期望这样的输出:

在此输入图像描述

我通过命令获得此输出watch -n x ./myScript.sh,其中x是秒的刷新值。如果我像这样编辑我的脚本:

#!/bin/bash
while sleep 1; do
   clear; # added to keep the information in the same line 
   echo "Célula calibrada: " $(npe ?AI1);
   echo "Anemómetro: " $(npe ?AI2);
   echo "Célula temperatura: " $(npe ?AI3);
   echo "Célula temperatura: " $(npe ?AI4);
done

我的输出伴随着烦人的闪烁:

在此输入图像描述

答案1

您可以使用tput cup 0 0将光标移动到屏幕的左上角。clear一次。

#!/bin/bash
clear
while sleep 1; do
    tput cup 0 0
    printf "%21s %6d    \n" \
      "Célula calibrada: "   $(npe ?AI1) \
      "Anemómetro: "         $(npe ?AI2) \
      "Célula temperatura: " $(npe ?AI3) \
      "Célula temperatura: " $(npe ?AI4)
done

答案2

在 bash 中实现实时解决方案可能很棘手。

您可以使用多种方法在 X 秒内运行一次脚本watch。我假设你已经有myScript.sh可用的。将 X 替换为您需要的秒数。

  1. watch -n X ./myScript.sh

  2. while sleep X; do ./myScript.sh; done

    更新。为了模拟观看,您可能需要在迭代之间清除屏幕。在脚本内部它将看起来像这样:

    while sleep X; do 
       clear; 
       command1;
       command2;
    done
    
  3. 将上述选项之一添加到脚本本身。

答案3

我假设闪烁是因为您的命令需要一些时间才能返回其值。这是我通常的解决方法:

cmds(){
  echo "Célula calibrada: " $(npe ?AI1);
  echo "Anemómetro: " $(npe ?AI2);
  echo "Célula temperatura: " $(npe ?AI3);
  echo "Célula temperatura: " $(npe ?AI4);
}

while true; do
  out="$(cmds)"
  clear
  echo "$out"
  sleep 1
done

我们的想法是在最后一刻清除屏幕。

答案4

你完全可以在 bash 中做到这一点。如果文字仍然闪烁,则说明您还没有完全阅读前面的答案。

你必须对着clear屏幕您回显新值,而不是之后。

相关内容