如何解决带有管道的 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
从 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"
解决方法
export default useApi = (apiFunc,addToArray = false) => {
const [data,setData] = useState([]);
const [error,setError] = useState(false);
const [loading,setLoading] = useState(false);
const [index,setIndex] = useState(0);
//Loading marketdata
const request = async (...args) => {
setLoading(true);
const response = await apiFunc(...args);
setLoading(false);
if (!response.ok) return setError(true);
setError(false);
if (addToArray) {
response.data[0].index = index; //Add the variable index to the array
var newArray = [...data,response.data[0]]; //
setIndex(index + 1);
setData(newArray);
} else {
setData(response.data);
}
};
return { data,error,loading,request };
};
这里的 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
如果我需要在屏幕上打印命令的输出,不使用 echo 怎么办?
如果您想在jkbms -p 3C:A5:19:7B:28:09 -o json|tee /home/bms/batt.log|jq -r '.highest_cell_voltage'
中保存输出,您可以随时/home/bms/batt.log
。
如果您只想在执行时在屏幕上打印命令的输出,您可以使用 cat /home/bms/batt.log
而不是 tee /dev/tty
。
如果在执行时您想要在屏幕和日志文件中的输出,您可以一次tee /home/bms/batt.log
。