bash脚本检索dbus输出

bash脚本检索dbus输出,bash,shell,dbus,Bash,Shell,Dbus,今天,我必须检索dbus命令的结果 dbus-send --session --print-reply --dest="com.ac.comp" /com/ac/comp/Time com.ac.comp.Time.GetTime 当我执行上述命令时,我获得以下输出: method return sender=:1.0 -> dest=:1.34 reply_serial=2 byte 0 byte 0 byte 0 byte 0 byte 0 byt

今天,我必须检索dbus命令的结果

dbus-send --session --print-reply --dest="com.ac.comp" /com/ac/comp/Time com.ac.comp.Time.GetTime
当我执行上述命令时,我获得以下输出:

method return sender=:1.0 -> dest=:1.34 reply_serial=2
   byte 0
   byte 0
   byte 0
   byte 0
   byte 0
   byte 0
   uint16 0
数值按以下顺序给出:

second
minute
hour
weekday
dateday
month
year
我已按如下方式实现了我的bash:

dbus-send --session --print-reply --dest="com.ac.comp" /com/ac/comp/Time com.ac.comp.Time.GetTime | grep -E byte | cut -c 9-11 > "$file" 
dbus-send --session --print-reply --dest="com.ac.comp" /com/ac/comp/Time com.ac.comp.Time.GetTime | grep -E uint16 | cut -c 11-13 >> "$file" 

second=$(sed -n '1p' < $file)
minute=$(sed -n '2p' < $file)
hour=$(sed -n '3p' < $file)
weekday=$(sed -n '4p' < $file)
dateday=$(sed -n '5p' < $file)
month=$(sed -n '6p' < $file)
year=$(sed -n '7p' < $file) 
echo -e "Time ==> Day : $weekday - Date : $dateday/$month/$year - Time : $hour:$minute:$second"  
dbus发送——会话——打印回复——dest=“com.ac.comp”/com/ac/comp/Time com.ac.comp.Time.GetTime | grep-E byte | cut-c 9-11>“$file”
dbus发送--会话--打印回复--dest=“com.ac.comp”/com/ac/comp/Time com.ac.comp.Time.GetTime | grep-E uint16 | cut-c 11-13>>“$file”
秒=$(sed-n'1p'<$文件)
分钟=$(sed-n'2p'<$文件)
小时=$(sed-n'3p'<$文件)
工作日=$(sed-n'4p'<$文件)
dateday=$(sed-n'5p'<$文件)
月份=$(sed-n'6p'<$文件)
年份=$(sed-n'7p'<$文件)
echo-e“Time==>Day:$weekday-Date:$dateday/$month/$year-Time:$hour:$minute:$second”
这项工作做得很正确。然而,我确信我的脚本可以最大化,dbus不需要被调用两次,而且有一种方法可以用更少的行完成所有的事情

作为新的bash程序员,我需要关于这个问题的建议和学习新方法

array=($(dbus-send --session --print-reply --dest="com.ac.comp" /com/ac/comp/Time com.ac.comp.Time.GetTime))
也许在这里的某个地方你在追求什么:

echo "Seconds = ${array[7]}"
echo "Minutes = ${array[9]}"
.
.

您不需要使用额外的重定向,sed能够从文件中读取输入。也就是说,sed-n'1p'$file可以很好地工作,谢谢!我刚试过你的指令,结果相同,删除了七行--“没有必要预切文件。”。sed也可以做这项工作(并且以一种不太容易出错的方式)
sed-e'1{s/^\+(byte | uint16)/;p}'
或类似的东西。尽管效率的高低取决于在N个sed实例中执行该操作是否比在一个cut实例中执行N次要好。您的意思是您发出的sed命令可以生成相同的输出?我尝试了同一行和修改,但我只得到了第一行。谢谢,我很抱歉,但一个小时后,我无法应用您的示例,因此只能调用dbus send一次,并且只存储字节和uint16值。你能提供更多的细节吗?谢谢你,阿贾斯克尔!这是一个很好的选择,我没有义务创建一个文件。不过,我要问最后一个问题。为什么指定${array[7]}来检索第一个字节值?在“method return sender=:1.0->dest=:1.34 reply_serial=2”行中,只有五个术语?我刚刚从您的输出中计算出,您将首先拥有您不需要的额外字符串,并且第一个数据可能会进入索引7,即该数组中的单元格编号8,因为在实际值之前有单词“byte”。i、 e.0:方法1:返回2:发送方=:1.0 3:->4:。。