【问题标题】:Is the output of tools like `ip` meant to be parsed?像`ip`这样的工具的输出是否意味着被解析?
【发布时间】:2013-02-04 21:04:17
【问题描述】:

例如,Ubuntu lxc-start-ephemeral bash 脚本执行以下操作来检测正在启动的容器的 IP 地址:

# Grab all the public globally routed IPv4 and IPv6 addresses
(sudo ip netns exec $NAME ip -4 addr show scope global && \
 sudo ip netns exec $NAME ip -6 addr show scope global) | grep inet | while read line; do
    ip=$(echo $line | awk '{print $2}' | cut -d '/' -f1)
    echo "$ip"
done

我个人不太喜欢这种方法,因为它需要大量摆弄字符串和输出。是否有一个编程 API 来访问相同的信息(不一定在 bash 中),或者它是“正确的方式”来总是使用像 ip 这样的工具,并希望你的解析不会与其他版本的同一个工具?

【问题讨论】:

    标签: bash unix command-line scripting


    【解决方案1】:

    还可以考虑/sys (sysfs),例如/sys/class/net/<device name>/...

    【讨论】:

    • 我很困惑,你是说接口的IP在里面吗?因为我看过了,可惜没看到
    【解决方案2】:

    在 shell 脚本中,您倾向于通过解析文本来访问数据。这主要是因为 shell 代码只能真正操作字符串,还因为文本比二进制表示更便携。

    但是,通常有 UI 命令和 API 命令,shell 脚本应该使用后者而不是前者。例如,您应该调用stat 而不是尝试解析ls -l 输出。或者/proc 中可能有一个文件包含您想要的信息,因此您根本不必运行命令 - 但该文件中的数据仍将是文本形式。

    所以,是的 - 当您编写 shell 脚本时,您基本上会被困在为所有内容解析文本。

    【讨论】:

      【解决方案3】:

      使用 Proc 文件系统

      如果您只是想要一种不同的方式来解析您的 IP 地址,您可以直接解析 /proc/net/arp。你仍然需要解析出你想要的数据,但是只有当 Linux 内核改变了 proc 文件系统时,数据的格式才会改变。恕我直言,这对于大多数用途来说似乎足够稳定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 2013-02-05
        • 2012-08-16
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多