带有管道的 Cat 命令在 bash 中工作但不在脚本中

Cat command with pipe working in bash but not in script

非常简单的脚本,但我卡住了。

它连接到电池平衡器,将信息输出到 json 格式的文件中。然后我将输出通过管道传输到 jq 以获得我需要的信息。 它适用于 bash shell,但不适用于脚本:

这是脚本:

echo "Checking battery voltages"
jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
echo cat /home/bms/batt.log | jq -r '.highest_cell_voltage'
echo "done"

cat 行在脚本输出中显示了这一点:

Checking battery voltages
parse error: Invalid numeric literal at line 1, column 4
done

从 shell 它按预期工作:

cat /home/bms/batt.log | jq -r '.highest_cell_voltage'
4.152044773101807

我试过用引号等将整个 cat 命令括起来,但我不知所措。

编辑:

然而,这有效:

echo "Checking battery voltages"
jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
batt=$(cat /home/bms/batt.log)
echo $batt | jq -r '.highest_cell_voltage'
#echo /usr/bin/cat /home/bms/batt.log
echo "done"
jkbms -p 3C:A5:19:7B:28:09 -o json > /home/bms/batt.log
echo cat /home/bms/batt.log | jq -r '.highest_cell_voltage'

这里的echo是错误的。顺便说一句,你可以将上面的简化为:

jkbms -p 3C:A5:19:7B:28:09 -o json|tee /home/bms/batt.log|jq -r '.highest_cell_voltage'

If I need to print the output of the comand on the screen, how do i do it without using echo?

如果您想要 /home/bms/batt.log 中保存的输出,您可以随时 cat /home/bms/batt.log
如果你想仅在执行时在屏幕上打印命令的输出,你可以tee /dev/tty而不是tee /home/bms/batt.log
如果在执行时你想在屏幕上和日志文件中输出,你可以 tee /home/bms/batt.log /dev/tty 一次。