bash - 带有管道的 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"
解决方案
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
立即进行。
推荐阅读
- asp.net-mvc - 是否可以创建一个可重用的 Html.CheckboxesFor
() 助手与其他内置助手一致 - visual-studio-code - 选择多行时的 VS Code 键盘快捷键
- jquery - 将项目添加到 Select2 级联
- java - 如何从 Android 中的应用程序设置中选择语言?
- python - DJANGO - 使用按钮调用 TKINTER 程序
- elasticsearch - 弹性搜索边缘 ngram 未返回所有预期结果
- css - CSS 媒体查询适用于桌面大小
- swiftui - SwiftUI 在选项卡之间导航的正确方式
- javascript - 用于在 html oninput 中添加多个数组的 Javascript
- git - 如何使用 git filter-repo 同时考虑其文件路径和数据来修改 blob?