在 Linux 机器上,我有一系列命令提供不同传感器状态的数值。
这些命令的调用类似于以下内容:
$ command1
5647
$ command2
76
$ command3
8754
这些值实时变化,每次我想检查其中一个值的状态时,我都必须重新启动命令......这对我没有任何好处,因为我需要双手来操作硬件。
我的目标是制作一个简单的 Bash 脚本,它调用这些命令并保持值更新(实时异步或每 x 秒刷新一次值),如下所示:
$ ./myScript.sh
command1: x
command2: y
command3: z
command4: v
其中x
、y
、z
和v
是变化的值。
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 替换为您需要的秒数。
watch -n X ./myScript.sh
while sleep X; do ./myScript.sh; done
更新。为了模拟观看,您可能需要在迭代之间清除屏幕。在脚本内部它将看起来像这样:
while sleep X; do clear; command1; command2; done
将上述选项之一添加到脚本本身。
答案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
屏幕前您回显新值,而不是之后。