首页 > 解决方案 > 带有管道的 Cat 命令在 bash 中工作但不在脚本中

问题描述

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

它连接到电池平衡器,将信息输出到 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

从外壳它按预期工作:

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"

标签: bashcatscript

解决方案


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'

如果我需要在屏幕上打印命令的输出,不使用 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立即进行。


推荐阅读