【问题标题】:Parse output from bash script to Rails将 bash 脚本的输出解析到 Rails
【发布时间】:2016-04-28 06:30:49
【问题描述】:

我有一个来自另一个 stackoverflow 问题的 bash 脚本来获取我所有的串行连接设备:

#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
    (
        syspath="${sysdevpath%/dev}"
        devname="$(udevadm info -q name -p $syspath)"
        [[ "$devname" == "bus/"* ]] && continue
        eval "$(udevadm info -q property --export -p $syspath)"
        [[ -z "$ID_SERIAL" ]] && continue
        echo "{name: '/dev/$devname', id_serial: '$ID_SERIAL'}"
    )
done

我试图将它们解析为对象数组,以便在 Rails 视图上迭代和显示它们。输出是这样的:

{name: '/dev/input/event16', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/input/mouse2', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/hidraw0', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/usb/hiddev3', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/input/event17', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/hidraw1', id_serial: 'Logitech_USB_Receiver'}
{name: '/dev/input/event15', id_serial: 'SunplusIT_INC._Integrated_Camera'}
{name: '/dev/media0', id_serial: 'SunplusIT_INC._Integrated_Camera'}
{name: '/dev/video0', id_serial: 'SunplusIT_INC._Integrated_Camera'}

在 Rails 控制台中,这是输出:

2.2.4 :001 > `./lib/scripts/get_serial.sh`
 => "{name: '/dev/input/event16', id_serial: 'Logitech_USB_Receiver'}\n{name: '/dev/input/mouse2', id_serial: 'Logitech_USB_Receiver'}\n{name: '/dev/hidraw0', id_serial: 'Logitech_USB_Receiver'}\n{name: '/dev/usb/hiddev3', id_serial: 'Logitech_USB_Receiver'}\n{name: '/dev/input/event17', id_serial: 'Logitech_USB_Receiver'}\n{name: '/dev/hidraw1', id_serial: 'Logitech_USB_Receiver'}{name: '/dev/media0', id_serial: 'SunplusIT_INC._Integrated_Camera'}\n{name: '/dev/video0', id_serial: 'SunplusIT_INC._Integrated_Camera'}\n"

所以我试图在我的控制器中像这样解析它:

def index
   @devices = `./lib/scripts/get_serial.sh`.strip.gsub(" ","").split("\n")
end

如果我这样做@devices[0],结果是:=> "{name:'/dev/input/event16',id_serial:'Logitech_USB_Receiver'}"

最后,在视图中:

<ul>
  <% @devices.each do |device| %>
    <li><%= device %> </li>
  <% end %>
</ul>

显示所有设备,但如果我这样做&lt;%= device.name %&gt; 我会得到一个错误或&lt;%= device['name'] %&gt; 我会得到“名称”这个词。

我的问题很简单。有没有更好的方法来执行此操作并将:name:id_serial 作为典型变量处理(迭代数组并打印它们)?

【问题讨论】:

    标签: ruby-on-rails ruby bash


    【解决方案1】:

    而不是:

    @devices = `./lib/scripts/get_serial.sh`.strip.gsub(" ","").split("\n")
    

    尝试使用:

    @devices = `./lib/scripts/get_serial.sh`.split("\n").map {|hash_string| eval(hash_string)}
    

    更多解释请查看How do I convert a String object into a Hash object?

    【讨论】:

    • 不幸的是,视图中的device['name'] 显示为空/空白值。
    • @ChrisV。为什么还要呢?试试device[:name]
    • 如果你不解释这个,我就辞去工作,成为一名面包师或垃圾收集者。
    • @ChrisV。符号不是字符串。看看这个,应该有帮助:stackoverflow.com/questions/9712706/…
    • 我的意思是地图和评估,而不是符号。您是否认为有更简单的方法来实现这一点(整个想法)?
    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2023-03-16
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多