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

bal*_*lon 9 linux shell scripting bash shell-script

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

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

$ command1
5647
$ command2
76
$ command3
8754
Run Code Online (Sandbox Code Playgroud)

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

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

$ ./myScript.sh
command1: x
command2: y
command3: z
command4: v
Run Code Online (Sandbox Code Playgroud)

其中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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我的输出带有恼人的闪烁:

在此处输入图片说明

gle*_*man 15

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 这需要修改为以固定宽度格式打印,或者在写入新值之前清除值(tput 也可以这样做)。否则,如果一个值的大小减少了一个数字,则前一个值的最后一位将不会被覆盖,从而导致看到的数字是错误的。 (9认同)

rus*_*ush 13

在 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将上述选项之一添加到脚本本身。


bxm*_*bxm 10

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

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
Run Code Online (Sandbox Code Playgroud)

这个想法是我们在最后可能的时刻清除屏幕。


Tob*_*ght 5

如果您clear紧跟在 之后sleep,而不是紧接在之前,您将能够更轻松地阅读输出:

#!/bin/sh
while sleep 1
do
   clear
   echo "Célula calibrada: " $(npe ?AI1)
   echo "Anemómetro: " $(npe ?AI2)
   echo "Célula temperatura: " $(npe ?AI3)
   echo "Célula temperatura: " $(npe ?AI4)
done
Run Code Online (Sandbox Code Playgroud)

但是,我会删除这里的循环,并用于watch重复运行脚本。这是单个工具的更灵活组合。